안녕하세요~! 쿼리질문드립니다 ㅠ 0 9 768

by 마들룽 [SQL Query] [2021.04.13 12:50:00]


안녕하세요 

현재 쿼리를 짜다가 막힌 부분이 있어 질문드립니다.

union all을 사용하여 1,2,3을 구분하여 데이터를 가져왔습니다.

그런데..내용 3이 없으면 내용1과 2만 표시됩니다 ㅠ

1

2

3

1

2

1

2

3

여기서 제가 하고싶은건 3번에 데이터가 없더라도

seq3번 row가 표시되게 끔 하고싶습니다.

혹시 좋은 방법을 배우고자 글 써봅니다!

감사합니다.

by 마농 [2021.04.13 13:01:58]

쿼리 내용에 따라 구현 방법이 달라질 수 있습니다.
작성하신 쿼리를 보여주세요.


by 마들룽 [2021.04.13 13:34:30]

마농님 안녕하세요! 댓글감사합니다

너무 길어서 간략하게 적었습니다 ㅠ

이렇게 적으면 될까요?

select  '1' as seq
         , chain_cd
         , sum(r_amt) as amt
   from a

 group by chain_cd
union all
select  '2' as seq
         , chain_cd
         , sum(t_amt) as amt
   from b

 group by chain_cd
union all
select  '3' as seq
        , chain_cd
        , sum(p_amt) as amt
  from c

 group by chain_cd

order by chain_cd, seq

 


by 마농 [2021.04.13 14:07:18]

사용하신 테이블 a, b, c 는 실제 다른 테이블인가요?
혹시 같은 테이블 조건만 다르게 조회하는 건 아닌지?
정보를 간략하게 주시는 건 좋은데 정보의 왜곡이 있으면 안됩니다.
실제 쿼리를 대변할 수 있는 예시 쿼리 맞는 거죠?


by 마들룽 [2021.04.13 14:12:58]

마농님 번거롭게해서 죄송합니다

실제 다른테이블의 데이터를 들고오는것입니다 ㅠ

A,B,C 모두 다른테이블입니다!


by 마농 [2021.04.13 14:28:22]
-- Oracle : Partition Outer Join --
SELECT b.chain_cd
     , a.seq
     , NVL(b.amt, 0) amt
  FROM (SELECT LEVEL seq FROM dual CONNECT BY LEVEL <= 3) a
  LEFT OUTER JOIN
       (SELECT 1 seq
             , chain_cd
             , SUM(r_amt) amt
          FROM a
         GROUP BY chain_cd
         UNION ALL
        SELECT 2 seq
             , chain_cd
             , SUM(t_amt) amt
          FROM b
         GROUP BY chain_cd
         UNION ALL
        SELECT 3 seq
             , chain_cd
             , SUM(p_amt) amt
          FROM c
         GROUP BY chain_cd
        ) b
       PARTITION BY (b.chain_cd)
    ON a.seq = b.seq
 ORDER BY chain_cd, seq
;

 


by 마들룽 [2021.04.13 14:40:20]

마농님 너무너무 감사합니다!!


by 마들룽 [2021.04.13 15:02:55]

마농님 죄송합니다 ㅠ 제가 하나를 빼먹고 말씀드렸어요....partition by가 안 먹힌다는 걸...


by 마농 [2021.04.13 15:41:36]
WITH tmp AS
(
SELECT 1 seq
     , chain_cd
     , SUM(r_amt) amt
  FROM a
 GROUP BY chain_cd
 UNION ALL
SELECT 2 seq
     , chain_cd
     , SUM(t_amt) amt
  FROM b
 GROUP BY chain_cd
 UNION ALL
SELECT 3 seq
     , chain_cd
     , SUM(p_amt) amt_3
  FROM c
 GROUP BY chain_cd
)
SELECT a.chain_cd
     , b.seq
     , NVL(c.amt, 0) amt
  FROM (SELECT DISTINCT chain_cd FROM tmp) a
 CROSS JOIN (SELECT LEVEL seq FROM dual CONNECT BY LEVEL <= 3) b
  LEFT OUTER JOIN tmp c
    ON a.chain_cd = c.chain_cd
   AND b.seq      = c.seq
 ORDER BY chain_cd, seq
;

 


by 마들룽 [2021.04.13 15:48:27]

마농님 너무 감사하고 제대로 배워갑니다 ㅠ!

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