Как добавить разные строки на основе диапазона дат в SQL Server - PullRequest
0 голосов
/ 26 июля 2011

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

У меня есть таблица, как показано ниже:

Date_From   Available  
01/03/2011       5  
06/03/2011       6  
25/03/2011       7   
14/04/2011       9  
20/04/2011      10  

Я хочу вывод в виде, подобном этому:

              Q3        Q4  
Sum           18        19  

, где Q3 и Q4 - общий рекорд за март и апрель.

Может кто-нибудь сказать мне, что я должен делать?

1 Ответ

0 голосов
/ 26 июля 2011

Я собираюсь предположить, что вас интересует не только март и апрель, и что вам действительно нужен ежемесячный сводный итог, каждый в отдельной колонке. Поскольку вы используете SQL Server 2005, вы можете сделать это с dynamic PIVOT. Следующий код протестирован и должен возвращать вам итоги за каждый месяц в отдельном столбце. Я также добавил год, если вы используете данные за несколько лет. Вы можете изменить заголовки столбцов, изменив сгенерированную строку даты, хотя вы должны позаботиться о том, чтобы сделать их уникальными и соответствовать требуемой группировке столбцов:

CREATE TABLE ##Tab (date_from datetime, available int)
INSERT INTO ##Tab (date_from, available) VALUES ('3/1/2011', 5)
INSERT INTO ##Tab (date_from, available) VALUES('3/6/2011', 6)
INSERT INTO ##Tab (date_from, available) VALUES('3/25/2011', 7)
INSERT INTO ##Tab (date_from, available) VALUES('4/14/2011', 9)
INSERT INTO ##Tab (date_from, available) VALUES('4/20/2011', 10)

DECLARE @month_year varchar(2000)
SELECT  @month_year = STUFF(
   ( SELECT DISTINCT '],[' + CAST(datepart(mm, date_from) AS varchar) + 
         '/' + CAST(datepart(yy, date_from) AS varchar)
     FROM    ##Tab
     ORDER BY '],[' + CAST(datepart(mm, date_from) AS varchar) + 
         '/' + CAST(datepart(yy, date_from) AS varchar)
     FOR XML PATH('')
   ), 1, 2, '') + ']'

DECLARE @dyn_pivot nvarchar(max)

SET @dyn_pivot =
    N'
        SELECT *
        FROM
        (
            SELECT CAST(datepart(mm, date_from) AS varchar) + ''/'' + CAST(datepart(yy, date_from) AS varchar) dt, SUM(available) AS available
            FROM ##Tab
            GROUP BY CAST(datepart(mm, date_from) AS varchar) + ''/'' + CAST(datepart(yy, date_from) AS varchar)
        ) AS SourceTable
        PIVOT
        (
            AVG(available)
            FOR dt IN (' + @month_year + N')
        ) AS PivotTable
    '

EXEC (@dyn_pivot)
...