Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- netstate
- trac
- 이클립스
- Babel
- 3.5
- resin
- NEXUS
- tomcat
- eclipse
- tagx
- CentOS6
- yum
- SSL
- Galileo
- 연동
- subversion
- Apache
- CentOS
- svn
- 삽질
- 갈릴레오
- 지름신
- Find
- 보드
- Powermockup
- linux
- 파워목업
- egrep
- 권한변경
- Java
Archives
- Today
- Total
....
MS-SQL 에서 달력이랑 조인하고 싶을때 유용한 쿼리.. 본문
통계쿼리를 짤때 보통 이런일이 자주 생기는데...
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
이걸 쿼리툴에 넣고 때려보곤 나도 모르게 미소를 지었다.... 쵝오~~!!!!!!
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