2009-11-17 5 views
1

내 응용 프로그램에서 차트를 구현해야합니다. 난 테이블 구조를했다고 가정차트에 결과 표시

DECLARE @SONGS TABLE 
(
    [ID] INT IDENTITY, 
    [SONGNAME] VARCHAR(20), 
    [CREATEDDATE] DATETIME 
) 


INSERT INTO @SONGS 
SELECT 'SONG1','20091102' UNION ALL 
SELECT 'SONG2','20091103' UNION ALL 
SELECT 'SONG3','20091107' UNION ALL 
SELECT 'SONG4','20091107' UNION ALL 
SELECT 'SONG5','20091107' UNION ALL 
SELECT 'SONG6','20091109' 

이제 사용자 외부로부터 날짜와 종료 날짜를 시작 합격 아래

DECLARE @STARTDATE DATETIME 
DECLARE @ENDDATE DATETIME 

SET @STARTDATE='20091101' 
SET @ENDDATE='20091111' 

같은 파라미터 이제 사용자 가지고 상기 하나 이상의 옵션 (말 @OPTION VARCHAR (20)) 그는 시작 날짜와 종료 날짜 사이의 개별 날짜로 분리 된 날짜가 포함 된 결과를 원하는지 여부와 상관없이 둘째 옵션은 연도와 마찬가지로 시작 날짜와 종료 날짜 사이의 날짜로 날짜를 포함하도록 선택할 수 있습니다.

--OUTPUT I NEED IS when @OPTION IS DATE 

DATE  [SONGCOUNT] 
------------------------------------------ 
20091101  0 
20091102  1 
20091103  1 
20091104  0 
20091105  0 
20091106  0 
20091107  3 
20091108  0 
20091109  1 
20091110  0 
20091111  0 

마찬가지로 나는 옆에 개수가있는 옵션 (일, 주, 월, 년)에 따라 날짜가 분리 된 결과를 원합니다. 제 목표는 x 축에 날짜를 표시하고 y 축에 계산하는 것입니다. 동일한 방법을 제안 할 수 있습니까?

답변

1
DECLARE @dimDate TABLE (
myDate datetime 
,dt int 
,yr int 
,ym int 
) 

DECLARE @dte datetime 

SET @dte = @STARTDATE 
WHILE @dte <= @ENDDATE 
    BEGIN 
     INSERT INTO @dimDate (myDate, dt, yr, ym) 
     VALUES(
      @dte 
      ,datepart(yy,@dte)*10000+ datepart(mm,@dte)*100 + datepart(dd,@dte) 
      ,datepart(yy,@dte) 
      ,datepart(yy,@dte)*100+ datepart(mm,@dte) 
      ) 
     SET @dte = dateadd(dd,1,@dte) 
    END 

.

DECLARE @option varchar(2) 
SET @option ='dt' 

.

-- per day 
IF @option ='dt' 
BEGIN 
SELECT d.dt, COUNT(s.ID) AS "song_count" 
    FROM @dimDate AS d 
    LEFT JOIN @SONGS AS s ON d.myDate = s.CREATEDDATE 
    GROUP BY d.dt 
END 

.

-- per year 
IF @option ='yr' 
BEGIN 
SELECT d.yr, COUNT(s.ID) AS "song_count" 
    FROM @dimDate AS d 
    LEFT JOIN @SONGS AS s ON d.myDate = s.CREATEDDATE 
    GROUP BY d.yr 
END 

. X & Y 축, 사용 PIVOT (SQL 서버 2005 +)의 결과를 만들기위한

-- per year-month 
IF @option ='ym' 
BEGIN 
SELECT d.ym, COUNT(s.ID) AS "song_count" 
    FROM @dimDate AS d 
    LEFT JOIN @SONGS AS s ON d.myDate = s.CREATEDDATE 
    GROUP BY d.ym 
END