我的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语句执行所描述的任务吗?
答案 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
<强> @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;