....

MS-SQL 에서 달력이랑 조인하고 싶을때 유용한 쿼리.. 본문

DB

MS-SQL 에서 달력이랑 조인하고 싶을때 유용한 쿼리..

idkook 2009. 4. 30. 14:30

통계쿼리를 짤때 보통 이런일이 자주 생기는데...

MEMBER에서 가입자를 대충 일자별로 알고 싶다고 할 경우 대략 이런식의 쿼리가 나온다..

SELECT COUNT(ID)
FROM MEMBER
WHERE REG_DATE BETWEEN @START_DT AND @END_DT
GROUP BY CONVERT(VARCHAR(10), REG_DATE, 120)

가입일자별로 그룹을 해서 카운트를 새는.. 뭐 대충 이런 비슷한 류로 나오는데..
(문법적인거나 성능적인건 패스.. 그렇다.. 난 MS-SQL은 아예 이번에 처음 써본다.. 맨 인포믹스에 오라클만 쓰다가.... 그리고 사실 SQL쪽은 실력이 너무너무 미천한데다가 위 쿼리는 그냥 머릿속에서 생각나는데로 즉시 타이핑한 것이였다.....)

그런데 문제는 가입자가 한명도 없는 날에는 0으로 안찍히고 아예 레코드가 나오지를 않는다.

이런 자료는 진짜 통계라고 할 수가 없다.. 챠트를 만들때도 중간에 펑크가 나고...

쿼리 실력이 미천한지라.. 이럴때 생각나는건 달력테이블을 하나 만들어서 조인을 걸어서 NVL(MS-SQL은 ISNULL이였나...)같은 명령으로 없는 자료에는 0으로 심어주는 방법이 생각나긴 했지만...

달력은??????? 어떻게 하나 하다가 database.sarang.net (정말 사랑하고픈 사이트다....) 에서 좋은 자료를 찾았다..


WITH MYCAL AS (
 SELECT CAST('2009-01-01' AS DATETIME) DT
  , IDX = 1
 UNION ALL
 SELECT DT + 1
  , IDX + 1
 FROM MYCAL
 WHERE DT + 1 <= '2009-02-28'
)
SELECT
   IDX
 , [DT]
 , [DT_1]  = DATEADD(DD, -1, DT)
 , [YMD]   = CONVERT(CHAR(8), DT, 112)
 , [YY]   = DATEPART(YEAR, DT)
 , [MM]   = DATEPART(MONTH, DT)
 , [DD]   = DATEPART(DAY, DT)
 , [WKDAY_SEQ] = DATEPART(DW, DT) 
 , [QTR]   = DATEPART(QQ, DT)
 , [ANIMAL]  = CASE DATEPART(YEAR, DT) % 12 - 3
      WHEN 1 THEN '자' WHEN 2 THEN '축' WHEN 3 THEN '인'
      WHEN 4 THEN '묘' WHEN 5 THEN '진' WHEN 6 THEN '사'
      WHEN 7 THEN '오' WHEN 8 THEN '미' WHEN 9 THEN '신'
      WHEN 10 THEN '유' WHEN 11 THEN '술' WHEN 12 THEN '해' END
FROM MYCAL
OPTION (MAXRECURSION 0)

출처 : http://database.sarang.net/?inc=read&aid=4275&criteria=mssql&subcrit=&id=&limit=20&keyword=%B3%AF%C2%A5&page=2

이걸 쿼리툴에 넣고 때려보곤 나도 모르게 미소를 지었다.... 쵝오~~!!!!!!

Comments