分组和总和季度值

时间:2012-12-18 17:00:04

标签: sql sql-server tsql sql-server-2012


我的SQL Server 2012实例中有以下表:

+---------+---------+
| Quarter | Values  |
+---------+---------+
| Q1      | 10      |
| Q2      | 15      |
| Q3      |  5      |
| Q4      |  1      |
+---------+---------+

我想分组季度以便总和值来获得 Q1 = 25
Q2 = 31
因此,Q2总和也是Q1中存在的先前值。 如果我有Q3,则总和将是Sum(Q1)+ Sum(Q2)+ Sum(Q3)。
通过这种方式,简单的Group by子句不起作用。 有人帮我找一个解决方案,以便在不使用Union的情况下使用简单的select语句执行所描述的任务吗?

2 个答案:

答案 0 :(得分:2)

由于您使用的是SQL 2012,因此您也可以使用RANGES

SELECT DISTINCT
  TheQuarter
  , SUM( TheValue ) OVER ( ORDER BY TheQuarter RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS "RollingSum"
FROM 
  MyData

SQL-Fiddle

<强> @edit:

如果您要处理多年,请参阅this fiddle

答案 1 :(得分:1)

请注意,如果您要处理多年,则可能需要更改此查询。

--Setup sample table
DECLARE @MyData TABLE (
    TheQuarter VARCHAR(2) NOT NULL,
    TheValue INT NOT NULL
);

--insert sample data
INSERT INTO @MyData VALUES ('Q1',10),
    ('Q1',15),
    ('Q2',5),
    ('Q2',1);

WITH Totals AS (SELECT ROW_NUMBER() OVER (ORDER BY TheQuarter ASC) AS [QuarterIndex],
            TheQuarter, SUM(TheValue) AS [TotalValue]
        FROM @MyData GROUP BY TheQuarter)
    SELECT t.TheQuarter, SUM(tPlusPrev.TotalValue) AS [TotalValue]
    FROM Totals t
        LEFT OUTER JOIN Totals tPlusPrev ON t.QuarterIndex >= tPlusPrev.QuarterIndex
    GROUP BY t.TheQuarter;