문제: 사용자로부터 특정 연월 (예: 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)에 대해서도 틈틈이 작성해서 갱신하겠습니다.

읽어주셔서 감사합니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기