쿼리질문좀 드리겠습니다. 0 5 3,863

by stylebox CROSS JOIN OUTER JOIN [2012.03.02 17:33:02]



A테이블
B테이블
  C테이블
A
a
A-a 20
B
b
A-c 30
C
c
B-d 20


d
C-a 10




A-a 10







결과물




A-a 30



A-b  



A-c 30



A-d  



B-a  



B-b  



B-c  



B-d 20



C-a 10



C-b  



C-c  



C-d  





현재 개발은 A테이블을 for문으로 돌려서..
B와C를 조인해서

결과를 뽑고 있는데요.
이걸 쿼리로 하고 싶은데
가능할까요..??

A테이블에 A를 B테이블에 있는 값를 다 포함해서.
C테이블에 있는 값을 sum하는건데.

질문이 부족하지만 가능한지 답변좀 부탁드릴꼐요.
매번 도움을 얻고 있는데
오늘도 행복한 하루되세요.
by 당직하사 [2012.03.02 17:45:05]

단순히 위에 보이는 자료를 가지고만 한다면..

  SELECT A.TGT_ID
   , SUM (B.VAL)
    FROM (SELECT A.ID || '-' || B.ID TGT_ID
    FROM (SELECT 'A' ID FROM DUAL
  UNION
  SELECT 'B' ID FROM DUAL
  UNION
  SELECT 'C' ID FROM DUAL) A
   , (SELECT 'a' ID FROM DUAL
  UNION
  SELECT 'b' ID FROM DUAL
  UNION
  SELECT 'c' ID FROM DUAL
  UNION
  SELECT 'd' ID FROM DUAL) B) A
   , (SELECT 'A-a' ID
   , 20 VAL
    FROM DUAL
  UNION
  SELECT 'A-c' ID
   , 30 VAL
    FROM DUAL
  UNION
  SELECT 'B-d' ID
   , 20 VAL
    FROM DUAL
  UNION
  SELECT 'C-a' ID
   , 10 VAL
    FROM DUAL
  UNION
  SELECT 'A-a' ID
   , 10 VAL
    FROM DUAL) B
   WHERE A.TGT_ID = B.ID(+)
GROUP BY A.TGT_ID
ORDER BY A.TGT_ID

이런식으로 해야 할거 같은데.. 도움이 되셨는지 모르겠네요..

by stylebox [2012.03.02 17:50:12]

참고로 A테이블하고 B테이블은 고정된게 아니라..
많아질수 있습니다.

위의 자료는 간단하게 표현하기 위해 작성했구요..
당직하사님 답변감사합니다.

참고로 한번 연구를 해볼꼐요.
행복한 주말되세요.

by 마농 [2012.03.02 17:57:16]
WITH a(c1) AS
(
SELECT 'A' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
)
, b(c2) AS
(
SELECT 'a' FROM dual
UNION ALL SELECT 'b' FROM dual
UNION ALL SELECT 'c' FROM dual
UNION ALL SELECT 'd' FROM dual
)
, c(c3, v) AS
(
SELECT 'A-a', 20 FROM dual
UNION ALL SELECT 'A-c', 30 FROM dual
UNION ALL SELECT 'B-d', 20 FROM dual
UNION ALL SELECT 'C-a', 10 FROM dual
UNION ALL SELECT 'A-a', 10 FROM dual
)
SELECT a.c1 ||'-'|| b.c2 c3
     , c.v
  FROM a
 CROSS JOIN b
  LEFT OUTER JOIN (SELECT c3, SUM(v) v FROM c GROUP BY c3) c
    ON a.c1 ||'-'|| b.c2 = c.c3
 ORDER BY c3
;

by 손님 [2012.03.02 18:05:20]

select a.code,c.value
from (
select a.value||'-'||b.value code
from a , b) a, c
where a.code = c.code(+)

by stylebox [2012.03.05 09:59:50]

마농님,손님님 답변 감사합니다.

with을 사용해서 a테이블과 b테이블을 조인해서

select a.value||'-'||b.value code
from a , b 이런방식..

A-a
A-b...........
이렇게 만든다음..
join으로 처리를 했네요.
덕분에 많이 배웠습니다.
항상 감사하며 행복한 하루되시길 바랍니다.

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