데이터베이스 개발자 질문과 답변 게시판
월별 집계를 구하는 방법에 대해서..
-------------------------------------------------------
제가 통계를 구하는 작업을 하고 있는데요. 좀 막히는 부분이 있어 도움을 구합니다.
emp1 이 "2012/01/15"일 부터 "2012/10/30" 일까지 근무했다고 했을 때.
집계 기준을 말일에 근무하면 "1"로 아니면 "0"으로 집계하고자 합니다. 어떻게 하면 될까요?
..아래 표 참조.
UserID | StartDate | EndDate |
emp1 | 20120115 | 20121030 |
emp2 | 20120306 | 20120730 |
결과
UserID | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | 1211 | 1212 |
emp1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
emp2 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
Comment 4
-
진윤호
2012.12.06 17:57
-
bjkim@
2012.12.06 18:07
달력 테이블을 만드시고 비교하세요.
(또는 매월 말일만 들어있는 테이블을 만드셔서 활용)
SET NOCOUNT ON
DECLARE @MM INT
DECLARE @I INT
DECLARE @Tmp TABLE ( NUM INT )
SELECT @MM = 12, @I = 0
WHILE ( @I < @MM )
BEGIN
INSERT INTO @Tmp VALUES ( @I )
SET @I = @I + 1
END
WITH TEST AS (
SELECT 'emp1' AS USERID, '20120115' AS StartDate, '20121030' AS EndDate
)
, CAL AS (
SELECT NUM, CONVERT(CHAR(8), DATEADD(D, -1, DATEADD(M, NUM, '20120201')), 112) AS LastDay
FROM @Tmp A
)
SELECT LEFT(A.LastDay, 6) AS MM
, CASE WHEN B.USERID IS NULL THEN '0' ELSE '1' END
FROM CAL A
LEFT OUTER JOIN TEST B ON A.LastDay BETWEEN B.StartDate AND B.EndDate
-
탱소연
2012.12.06 19:05
오;;;; 한번 해보려고.... 머리 싸메고있었는데 터지기 일보직전이었네요 ㄷㄷ
근데 문의점...
월의 마지막 날이 입력되는 테이블을 생성하기위해 -1 을 하기 위해서 일부러 @tmp 임시 테이블을 0부터 한 것인가요??
-
건우아빠
2012.12.07 00:20
declare @s_dt varchar(8) , @e_dt varchar(8)
set @s_dt = '20120115'
set @e_dt = '20121030' ;
with res
as (
select convert(varchar(8) , dateadd(dd,-1,dateadd(mm, number + 1, left(@s_dt,4) +'0101' )) ,112) lastdate
from master.dbo.spt_values
where type ='P'
and number < 12 )
select *
from ( select substring(lastdate,3,4) mon
, (case when lastdate between @s_dt and @e_dt then 1 else 0 end ) gb
from res ) as p
pivot
(
sum( p.gb)
for p.mon in ( [1201],[1202],[1203],[1204],[1205],[1206],[1207],[1208],[1209],[1210],[1211],[1212] )
) as pvt
말일에 근무 했는지 여부를 알수가 없는데;;
결과를 어떡해 뽑을 수 있는지 의문이네요;;
일 시작한 날과 끝나는 날만 존재하는데;;