【问题标题】:Grouping and sum Quarter values对季度值进行分组和求和
【发布时间】:2012-12-18 17:00:04
【问题描述】:


我的 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 子句就不起作用了。 谁能帮我找到一个解决方案,以便在不使用联合的情况下使用简单的选择语句来执行所描述的任务?

【问题讨论】:

  • 你用的是什么版本的sql server?

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


【解决方案1】:

由于您使用的是 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

【讨论】:

    【解决方案2】:

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

    --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;
    

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2015-05-17
      • 1970-01-01
      • 2011-02-15
      • 2012-03-29
      相关资源
      最近更新 更多