해당날짜에 데이터가 없어도 만들어서 출력하는 쿼리 1 2 1,179

by 나나나나 [2017.09.14 01:25:11]


안녕하세요
데이터가 없어도 해당날짜에 값이 찍히게 하는 쿼리를 만들고 싶습니다.(mysql)

테이블

날짜 상점 결제액
2017. 9. 1 미니미 1000
2017. 9. 1 미니미 1000
2017. 9. 3 미니미 1000
2017. 9. 4 미니미 1000
2017. 9. 5 미니미 1000
2017. 9. 1 2000
2017. 9. 3 2000
2017. 9. 5 2000
2017. 9. 5 2000

 

 

결과값

날짜 상점 총결제액
2017. 9. 1 미니미 2000
2017. 9. 3 미니미 1000
2017. 9. 4 미니미 1000
2017. 9. 5 미니미 1000
2017. 9. 1 2000
2017. 9. 3 2000
2017. 9. 4 0
2017. 9. 5 4000

조인 걸면 될 것도 같은데 생각처럼 쉽게 안나오네요

감사합니다.

by 마농 [2017.09.14 07:12:45]
WITH t AS
(
SELECT '2017. 9. 1' dt, '미니미' nm, 1000 amt FROM dual
UNION ALL SELECT '2017. 9. 1', '미니미', 1000 FROM dual
UNION ALL SELECT '2017. 9. 3', '미니미', 1000 FROM dual
UNION ALL SELECT '2017. 9. 4', '미니미', 1000 FROM dual
UNION ALL SELECT '2017. 9. 5', '미니미', 1000 FROM dual
UNION ALL SELECT '2017. 9. 1', '즈'    , 2000 FROM dual
UNION ALL SELECT '2017. 9. 3', '즈'    , 2000 FROM dual
UNION ALL SELECT '2017. 9. 5', '즈'    , 2000 FROM dual
UNION ALL SELECT '2017. 9. 5', '즈'    , 2000 FROM dual
)
-- Oracle
SELECT a.dt
     , b.nm
     , NVL(b.amt, 0)
  FROM (SELECT DISTINCT dt FROM t) a
  LEFT OUTER JOIN
       (SELECT dt, nm
             , SUM(amt) amt
          FROM t
         GROUP BY dt, nm
        ) b
 PARTITION BY (b.nm)
    ON a.dt = b.dt
 ORDER BY nm, dt
;
-- MySQL
SELECT a.dt
     , b.nm
     , IFNULL(c.amt, 0) amt
  FROM (SELECT DISTINCT dt FROM t) a
 CROSS JOIN
       (SELECT DISTINCT nm FROM t) b
  LEFT OUTER JOIN
       (SELECT dt, nm
             , SUM(amt) amt
          FROM t
         GROUP BY dt, nm
        ) c
    ON a.dt = c.dt
   AND b.nm = c.nm
 ORDER BY nm, dt
;

 


by jkson [2017.09.14 10:13:05]

mysql은 partition outer join이 없나보네요. dt와 nm cross join 성능이 어떨지..

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