오라클 union 쿼리 질문이에요! 질문추가! 0 13 1,057

by 계란에그 [2016.10.11 15:59:27]


3개의 union중

A,B,C 의 유니온 3개가 있다면

그중 B유니온의 컬럼 Date에만 -1 즉

A,B,C의 에 Date컬럼에서 예시) 20161011 이라면 B컬럼에만 20161010 을 출력하고싶은데 자꾸 대응하는식과 다르다고 나오는데 어떻게해야하나요?

 

 또 다른 질문은

A B C a_code b_code c_code
M KBS MBC 12345    
M KBS SBS 12345 12345 54321
M KBS SBS 12345 12345 54321
M KBS MBC 54321    
M KBS MBC 54321    

 위의 데이터가 존재하는데 c_code가 있는데이터는 컬럼C부분이 다른 3개와 다릅니다

또한 a_code가 다른a_code와 다릅니다 대신 c_code와 같은데

이런경우 SBS를 나머지 MBC로 출력하고싶은데 방법을 모르겠습니다.

 

by jkson [2016.10.11 16:24:03]

첫번째 질문은 union 이나 union all 하실 때

union 으로 구분되는 각 쿼리의 컬럼은 같은 형식이어야 합니다.

예를 들어 다음과 같이..

select 날짜형컬럼 from tableA

union

select 문자형컬럼 from tableB

이렇게 데이터형이 다르면 오류가 나게 되죠.

 

두번째 질문은 제가 이해력이 딸려서 무슨 말씀이신지 잘 모르겠네요.

예전에 많이 접해본 스타일의 설명글인 것 같은데.. 혹시 아이디 바꾸셨나요?ㅋ


by 계란에그 [2016.10.11 16:31:19]

아니에요,

첫번째 질문은 해결하였습니다.

,밑의 질문은

a_code , b_code , c_code 3개의 데이터를 모두가지고있는 데이터는

C컬럼값이 SBS로 되어있습니다. 또한 이 데이터는 A_code와 C_code가 다르며

나머지 C컬럼의 MBC는 위의 데이터 C_code와 모두 같습니다. /

즉 간단하게 SBS가 되어있고, a_code가 다른 a_code와 다른데

이것을 c_code를 가지고 MBC로 바꿀수가있나요?

case when을 사용하려고햇더니 잘안되서 고민입니다.


by jkson [2016.10.11 16:55:46]

MBC -> 547988

SBS -> 549269

이런식으로 코드가 관리되고 있는 건가요?

복잡하게 설명하신 것 같은데 A_CODE에만 값이 있고 B_CODE, C_CODE에 값이 없으면

C에 있는 값을 그대로 보여주고

A_CODE와 C_CODE가 다르면 C_CODE의 명칭을 보여주면 되는 건가요?

SELECT A, B
, CASE WHEN A_CODE != NVL(C_CODE,'*') THEN
            (SELECT 코드명칭 FROM 코드테이블 WHERE CODE = C_CODE)
       ELSE C
  END C
, A_CODE, B_CODE, C_CODE 
FROM T

이런 식으로 하시면 되지 않을까요?

이해가 여전히 잘 안 되네요. 뭘 원하시는지를 알기가 어려워요.

설명만 보면 그냥 C가 SBS이면 MBC로만 바꾸면 될 것 같이 적어놓으셔서..


by jkson [2016.10.11 17:39:38]

코드테이블이 있긴 있는 거죠? 547988코드가 MBC가 아닌가요?

맞다면 저대로 하면 MBC가 나올텐데요.

단순히 설명하신 조건으로 SBS를 MBC로 나오게 할 수는 있지만

정말로 그게 에그님이 원하시는 건지 확신할 수 없어 쿼리를

만들 수가 없네요.

---------------------------------------------------------------------

C_code는 4개중 3개 A,B,C = A를 묶고 그위에 한번더 조인하여

A,B를 묶었습니다

B테이블 컬럼 C_code

---------------------------------------------------------------------

=> 한국어인데 저는 에그님이 무슨 말씀을 하시는 건지 전혀 이해할 수가 없어요.

전에도 그런 분 계셨거든요;

이해력 좋으신 분 답글 좀 달아주세요..


by 계란에그 [2016.10.12 10:13:14]

제가바보같앗네요.

알려주신 case when으로 MBC가 나오긴했는데,

원래잇던 MBC값들은 null로 표기가되요

SBS의 C_code를 제외한 MBC C_code는 null값인데 그래서 그런건가요?


by jkson [2016.10.12 10:42:47]

일단 제가 말씀드린 조건(A_CODE에만 값이 있고 B_CODE, C_CODE에 값이 없으면 C에 있는 값을 그대로 보여주고 A_CODE와 C_CODE가 다르면 C_CODE의 명칭을 보여준다)

이 에그님이 원하시는 조건에 맞는 건지 확인해보시구요. 맞다면 아래 쿼리로 바꿔보세요.

제가 C_CODE NULL처리 조건을 잘못 줬네요.

SELECT A, B
, CASE WHEN A_CODE != NVL(C_CODE,A_CODE) THEN
            (SELECT 코드명칭 FROM 코드테이블 WHERE CODE = C_CODE)
       ELSE C
  END C
, A_CODE, B_CODE, C_CODE 
FROM T

이렇게 해보세요.


by 계란에그 [2016.10.12 12:15:57]

어찌어지하다가

조건을

c_code is not null로 주고

그다음은 말씀하신내용으로 햇더니 됫네요

지금 알려주신방법으로 시도해도 동일하게나옵니다.

감사합니다!


by 랑에1 [2016.10.11 18:09:45]

에그님 말로 설명마시고

표로 row data와 결과를 첨부해주시는게 빠를듯 싶습니다.


by 계란에그 [2016.10.11 18:55:53]
select A.a, A.b, C.c, A.a_code, B.b_code , D.c_code 
from (
         select A.a , A.b , C.c A.a_code, B.b_code from A,B,C
          where B.a_code = B.b_code
              and A.a_code = A.b_code(+)
         ) A, D 
    where A.a_code = D.c_code(+)

 


by 마농 [2016.10.12 10:26:09]

알리아스를 붙이긴 하셨네요. 그런데 엉망이네요.
쿼리만 보고 테이블간의 관계를 파악해야 하는데.
쿼리가 엉망이라 판단하기 어렵네요.
쿼리의 컬럼명과 테이블명을 정확하게 일치시켜 주세요.


by 마농 [2016.10.12 08:02:15]

쿼리를 너무 인위적으로 간략화 하셨네요.
실제 쿼리와 유사한지 의문이구요.
컬럼들이 어떤 테이블의 컬럼인지 알리아스를 달아 주세요.


by 계란에그 [2016.10.12 12:17:54]

위의 JKson님 쿼리

case when c_code is not null

then (select C from C where b_code = c_code)

else c end c

로 하여 해결하였습니다 감사합니다., 원문 쿼리가 너무길어 지져분하여 간략하게 하려다가 오히려  보기안좋게 표현하였네요.

 


by 마농 [2016.10.12 14:08:25]

제 생각엔 그렇게 어렵게 해결될 문제가 아닐 것으로 판단됩니다.

테이블명 컬럼명만 정확하게 표현해 주시면 쉽게 해결 가능하리라 봅니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입