3


SQLServer2012インスタンスに次のテーブルがあります。

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


値を合計してQ1=25
Q2 = 31を取得するために、四半期をグループ化したいと思います
。したがって、Q2は、Q1に存在する以前の値も合計します。Q3があった場合、合計はSum(Q1)+ Sum(Q2)+ Sum(Q3)になります。
このように、単純なGroupby句は機能しません。Unionを使用せずに単純なselectステートメントを使用して説明されたタスクを実行するための解決策を見つけるのを誰かが助けてくれますか?

4

2 に答える 2

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-フィドル

@編集:

複数年を扱っている場合は、このフィドルを参照してください。

于 2012-12-19T01:35:27.297 に答える
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;
于 2012-12-18T17:25:55.383 に答える