查询以在图表中显示结果

时间:2009-11-17 22:25:28

标签: sql-server sql-server-2005 charts

我必须在我的应用程序中实现图表。假设我有一个表结构

 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'

现在,用户还有一个选项(SAY @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轴上显示,你能否建议我实现相同的方法。

2 个答案:

答案 0 :(得分: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  

-- 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  

答案 1 :(得分:0)

在x&amp;中制作结果y轴,使用PIVOT(SQL server 2005 +)。

这种查询称为CROSS TAB QUERIES

供您参考 SQL Server PIVOT examples