문제: 사용자로부터 특정 연월 (예: 202204)을 입력받아 해당 연월의 달력을 표시하시오.
MSSQL 쿼리 기준으로 문제를 풀어봤습니다.
1. 시스템 테이블 기준으로 일자 추출
DECLARE @YM NCHAR(4)
,@DateFr NCHAR(8)
,@DateTo NCHAR(8)
SET @YM = '202204'
SET @DateFr = @YM + '01'
SET @DateTo = CONVERT(NCHAR(8), DATEADD(DD, -1, DATEADD(MM, 1, @DateFr)), 112)
CREATE TABLE #WkDate
(
WkDate NCHAR(8)
,WK INT
,DW INT
)
INSERT INTO #WkDate (WkDate, WK, DW)
SELECT CONVERT(VARCHAR, DATEADD(D, NUMBER, @DateFr), 112) AS WkDate
,DATEPART( WK, DATEADD(D, NUMBER, @DateFr)) AS WK
,DATEPART( DW, DATEADD(D, NUMBER, @DateFr)) AS DW
FROM MASTER..SPT_VALUES
WHERE TYPE = 'P'
AND NUMBER <= DATEDIFF(D, @DateFr, @DateTo)
2. 결과 SELECT
CREATE TABLE #Calendar
(
WK INT
,Serl INT
,D1 NVARCHAR(100)
,D2 NVARCHAR(100)
,D3 NVARCHAR(100)
,D4 NVARCHAR(100)
,D5 NVARCHAR(100)
,D6 NVARCHAR(100)
,D7 NVARCHAR(100)
)
-- 일자 INSERT
INSERT INTO #Calendar (WK, Serl, D1, D2, D3, D4, D5, D6, D7)
SELECT WK, 1, [1], [2], [3], [4], [5], [6], [7]
FROM #WkDate AS P
PIVOT(MIN(WkDate) FOR DW IN ([1], [2], [3], [4], [5], [6], [7])) AS PV
SELECT WK
,MAX(ISNULL(D1, '')) AS D1
,MAX(ISNULL(D2, '')) AS D2
,MAX(ISNULL(D3, '')) AS D3
,MAX(ISNULL(D4, '')) AS D4
,MAX(ISNULL(D5, '')) AS D5
,MAX(ISNULL(D6, '')) AS D6
,MAX(ISNULL(D7, '')) AS D7
FROM #Calendar
GROUP BY WK
ORDER BY WK
PIVOT을 활용하면 간단한 SQL 문장으로 이 문제를 해결할 수 있습니다.
오라클의 경우 DECODE를 쓰면 더욱 심플하게 구현이 가능합니다.
다른 DBMS 환경(Oracle, MySQL)에 대해서도 틈틈이 작성해서 갱신하겠습니다.
읽어주셔서 감사합니다.
반응형
최근댓글