среда, 27 марта 2013 г.

Как посчитать нарастающие итоги


-- Как посчитать нарастающие итоги

-- Посчитаем итоги по месяцам
    SELECT
        YEAR(OH.OrderDate) AS "Год"
        ,MONTH(OH.OrderDate) AS "Месяц"
        ,SUM(OD.LineTotal) AS "Итого"
    FROM
        AdventureWorks2012.Sales.SalesOrderHeader AS OH
            INNER JOIN
        AdventureWorks2012.Sales.SalesOrderDetail AS OD
            ON OD.SalesOrderID = OH.SalesOrderID
    GROUP BY YEAR(OH.OrderDate), MONTH(OH.OrderDate)

-- Посчитаем нарастающие итоги по месяцам
;WITH [Итоги по годам]
AS
(
    SELECT
        YEAR(OH.OrderDate) AS "Год"
        ,MONTH(OH.OrderDate) AS "Месяц"
        ,SUM(OD.LineTotal) AS "Итого"
    FROM
        AdventureWorks2012.Sales.SalesOrderHeader AS OH
            INNER JOIN
        AdventureWorks2012.Sales.SalesOrderDetail AS OD
            ON OD.SalesOrderID = OH.SalesOrderID
    GROUP BY YEAR(OH.OrderDate), MONTH(OH.OrderDate)
)
SELECT
    "Год"
    ,"Месяц"
    ,"Итого"
    ,SUM("Итого") OVER
        (
            ORDER BY "Год", "Месяц"
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS "Нарастающий итог"
FROM [Итоги по годам]
ORDER BY "Год", "Месяц";