달력의 각 일자 밑에 이름을 조회하는 쿼리를 만들려고 하는데요. 원하는 결과대로 쿼리를 작성하지 못하고 있습니다.
쿼리를 어떻게 작성하면 되는지 알려주시면 감사하겠습니다.
테이블
일자 | 성명 |
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주차 |
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 ;