날짜별 row별 조회 0 4 1,147

by 생각하쟈 [SQL Query] [2020.12.13 23:28:45]



안녕하세요
하 제가 요즘 sql로 하나 고민하고 있는데요..
그냥 pivot쓰면 되겠지 하고 있는데..
저는 안되더라구요..
일단 게시판 테이블엔 작성 시간, 타입 ,내용이 있는데
이걸 날짜별로 쫘르르 뽑아 오고 싶어요
다만 해당 날짜에 글이 없으면 그냥 공백이고
해당 날짜에 글이 두개이상이면 row를 하나 더 해서 
아래 사진처럼 보여주는거에요

날짜는 유동적으로 변할수 있구요..
혹시 어떤식으로 만들어야할까요..
힌트라도 주실수 있을까요?

by 마농 [2020.12.14 10:19:50]
WITH board AS
(
SELECT '2020-12-01' createdate, 'StarCraft' type, '스타는 재미있다' content FROM dual
UNION ALL SELECT '2020-12-01', 'StarCraft', '스타2도 재미있다' FROM dual
UNION ALL SELECT '2020-12-03', 'LOL'      , '롤은 재미있다'    FROM dual
UNION ALL SELECT '2020-12-05', 'StarCraft', '스타는 재미없다'  FROM dual
UNION ALL SELECT '2020-12-07', 'LOL'      , '롤은 재미없다'    FROM dual
)
SELECT *
  FROM (SELECT createdate, type, content
             , ROW_NUMBER() OVER(PARTITION BY type, createdate ORDER BY 1) rn
          FROM board
         WHERE createdate BETWEEN '2020-12-01' AND '2020-12-07'
        )
 PIVOT (MIN(content) FOR createdate IN ( '2020-12-01' "2020-12-01"
                                       , '2020-12-02' "2020-12-02"
                                       , '2020-12-03' "2020-12-03"
                                       , '2020-12-04' "2020-12-04"
                                       , '2020-12-05' "2020-12-05"
                                       , '2020-12-06' "2020-12-06"
                                       , '2020-12-07' "2020-12-07"
                                       ) )
 ORDER BY type, rn
;

 


by 생각하쟈 [2020.12.14 22:46:10]

와 진짜 진짜 감사합니다. 마농님

아 제가 생각 못했던게 content 를 Min으로 하는것을 몰랐어요.

저는 당연히 날짜로 pivot을 해서 어떻게 할까 생각하고 있었거든요 와 와 정말 정말 감사합니다.


by 생각하쟈 [2020.12.15 04:30:07]

아 근데..  저 IN 뒤에 날짜는 항상 저렇게 수동으로 넣을수 밖에 없는거죠?

기간이 한달이면 일일이 다 한달의 값을 다 넣어야하는거죠?


by 마농 [2020.12.15 08:24:33]

가변 열을 쿼리로 구현할 수는 없습니다.
고정 개수의 고정값에 대해서만 가능합니다.
가변 열로 하려면 동적쿼리로 구현하셔야 합니다.
다만 기간이 한달 또는 일주일 형태로 고정된다면?
한달의 경우 일자로 01~31 고정 형태로 구현 가능하고
일주일의 경우 요일로 일월화수목금토 고정 형태로 구현 가능합니다.

WITH board AS
(
SELECT '2020-12-01' createdate, 'StarCraft' type, '스타는 재미있다' content FROM dual
UNION ALL SELECT '2020-12-01', 'StarCraft', '스타2도 재미있다' FROM dual
UNION ALL SELECT '2020-12-03', 'LOL'      , '롤은 재미있다'    FROM dual
UNION ALL SELECT '2020-12-05', 'StarCraft', '스타는 재미없다'  FROM dual
UNION ALL SELECT '2020-12-07', 'LOL'      , '롤은 재미없다'    FROM dual
)
SELECT *
  FROM (SELECT SUBSTR(createdate, 9, 2) dd
             , type, content
             , ROW_NUMBER() OVER(PARTITION BY type, createdate ORDER BY 1) rn
          FROM board
         WHERE createdate LIKE '2020-12%'
        )
 PIVOT (MIN(content) FOR dd IN
        ( '01' "01", '02' "02", '03' "03", '04' "04", '05' "05"
        , '06' "06", '07' "07", '08' "08", '09' "09", '10' "10"
        , '11' "11", '12' "12", '13' "13", '14' "14", '15' "15"
        , '16' "16", '17' "17", '18' "18", '19' "19", '20' "20"
        , '21' "21", '22' "22", '23' "23", '24' "24", '25' "25"
        , '26' "26", '27' "27", '28' "28", '29' "29", '30' "30"
        , '31' "31") )
 ORDER BY type, rn
;

 

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