Запрос, чтобы показать результат в диаграммах - PullRequest
1 голос
/ 18 ноября 2009

Я должен реализовать диаграммы в своем приложении. Предположим, у меня есть структура таблицы

 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. Можете ли вы предложить мне способ реализовать то же самое.

Ответы [ 2 ]

1 голос
/ 18 ноября 2009
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  
0 голосов
/ 18 ноября 2009

Для получения результатов по оси x & y используйте PIVOT (SQL Server 2005 +).

Этот тип запросов называется CROSS TAB QUERIES

Для справки Примеры SQL Server PIVOT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...