mssql 쿼리 질문입니다. 0 1 330

by 잘하자~ [SQL Query] [2020.01.11 13:55:33]


달력의 각 일자 밑에 이름을 조회하는 쿼리를 만들려고 하는데요. 원하는 결과대로 쿼리를 작성하지 못하고 있습니다.

쿼리를 어떻게 작성하면 되는지 알려주시면 감사하겠습니다.

테이블

일자 성명
1 김철수
1 김영희
1 김서울
2 김서울
3  
4 김철수
4 김영등
5 김철수
5 김영희
5 김서울
6 김철수
6 김영희
7 김철수
8 김철수
8 김영희
8 김서울
9 김서울
10

김철수

 결과1 < 2020년 1월 달력>

- 주차별로 라인수가 동일하지 않음

주차
1주차       1 2 3 4
1주차       김철수 김서울   김철수
1주차       김영희     김영등
1주차       김서울      
2주차 5 6 7 8 9 10 11
2주차 김철수 김철수 김철수 김철수 김서울 김철수 김철수
2주차 김영희 김영희   김영희     김영등
2주차 김서울     김서울      
3주차 12 13 14 15 16 17 18
3주차 김철수 김영희         김영등
4주차 19 20 21 22 23 24 25
4주차   0   김영등   김영희  
5주차 26 27 28 29 30 31  
5주차   김영희     김영등    

 

결과2 <2020년 1월 달력>

- 주차별로 라인수가 동일하게 표시

주차

1주차       1 2 3 4
1주차       김철수 김서울   김철수
1주차       김영희     김영등
1주차       김서울      
2주차 5 6 7 8 9 10 11
2주차 김철수 김철수 김철수 김철수 김서울 김철수 김철수
2주차 김영희 김영희   김영희     김영등
2주차 김서울     김서울      
3주차 12 13 14 15 16 17 18
3주차 김철수 김영희         김영등
3주차              
3주차              
4주차 19 20 21 22 23 24 25
4주차   0   김영등   김영희  
4주차              
4주차              
5주차 26 27 28 29 30 31  
5주차   김영희     김영등    
5주차              
5주차              

 

by 마농 [2020.01.15 15:18:17]
WITH calendar AS
(
SELECT '2020-01-01' dt
 UNION ALL
SELECT CONVERT(VARCHAR(10), DATEADD(day, 1, dt), 23)
  FROM calendar
 WHERE dt <= '2020-01-31'
)
, copy_t AS
(
SELECT 0 lv
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
)
, data_t AS
(
SELECT '2020-01-01' dt, '김철수' nm
UNION ALL SELECT '2020-01-01', '김영희'
UNION ALL SELECT '2020-01-01', '김서울'
UNION ALL SELECT '2020-01-02', '김서울'
UNION ALL SELECT '2020-01-04', '김철수'
UNION ALL SELECT '2020-01-04', '김영등'
UNION ALL SELECT '2020-01-05', '김철수'
UNION ALL SELECT '2020-01-05', '김영희'
UNION ALL SELECT '2020-01-05', '김서울'
UNION ALL SELECT '2020-01-06', '김철수'
UNION ALL SELECT '2020-01-06', '김영희'
UNION ALL SELECT '2020-01-07', '김철수'
UNION ALL SELECT '2020-01-08', '김철수'
UNION ALL SELECT '2020-01-08', '김영희'
UNION ALL SELECT '2020-01-08', '김서울'
UNION ALL SELECT '2020-01-09', '김서울'
UNION ALL SELECT '2020-01-10', '김철수'
UNION ALL SELECT '2020-01-11', '김철수'
UNION ALL SELECT '2020-01-11', '김영등'
UNION ALL SELECT '2020-01-12', '김철수'
UNION ALL SELECT '2020-01-13', '김영희'
UNION ALL SELECT '2020-01-18', '김영등'
UNION ALL SELECT '2020-01-22', '김영등'
UNION ALL SELECT '2020-01-24', '김영희'
UNION ALL SELECT '2020-01-27', '김영희'
UNION ALL SELECT '2020-01-30', '김영등'
)
SELECT a.w
     , a.lv
     , MIN(CASE d WHEN 1 THEN COALESCE(dd, nm) END) Sun
     , MIN(CASE d WHEN 2 THEN COALESCE(dd, nm) END) Mon
     , MIN(CASE d WHEN 3 THEN COALESCE(dd, nm) END) Tue
     , MIN(CASE d WHEN 4 THEN COALESCE(dd, nm) END) Wed
     , MIN(CASE d WHEN 5 THEN COALESCE(dd, nm) END) Thu
     , MIN(CASE d WHEN 6 THEN COALESCE(dd, nm) END) Fri
     , MIN(CASE d WHEN 7 THEN COALESCE(dd, nm) END) Sat
  FROM (SELECT dt
             , DATEPART(week, dt) w
             , DATEPART(w, dt) d
             , CASE lv WHEN 0 THEN SUBSTRING(dt, 9, 2) END dd
             , lv
          FROM calendar
         CROSS JOIN copy_t
         WHERE dt LIKE '2020-01-%'
           AND lv <= 3
        ) a
  LEFT OUTER JOIN
       (SELECT dt, nm
             , ROW_NUMBER() OVER(PARTITION BY dt ORDER BY nm) rn
          FROM data_t
         WHERE dt LIKE '2020-01-%'
        ) b
    ON a.dt = b.dt
   AND a.lv = b.rn
 GROUP BY a.w, a.lv
 ORDER BY w, lv
;

 

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