SQL Server 入門 SQL Server 入門

SQL で累積を取得する 1

ホーム > 便利なT-SQL&クエリー集 > SQL で累積を取得する 1

SQL で累積を取得するには?

このページでは累積を取得するクエリーをご紹介します。

まずはシンプルな以下のようなケースです。

累積を取得する

まず以下のクエリーを実行し、テスト用のテーブルを作って、データをインサートしておきましょう。

CREATE TABLE Sales1 (
   SalesID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
   SalesDate DATE NULL,
   SalesAmount MONEY NULL
);

INSERT INTO Sales1 (
   SalesDate,
   SalesAmount
)
VALUES
   ('1/1/2011', 100),
   ('1/2/2011', 150),
   ('1/4/2011', 120),
   ('1/5/2011', 80),
   ('1/3/2011', 90);

以下のクエリーを実行すると、このページの最初の画像と同様の結果が得られるはずです。

SELECT   SalesDate,
         SalesAmount
FROM     Sales1
ORDER BY SalesDate;

クエリーの実行結果1

累積を計算する

オラクルでは、SUM() に PARTITION BY、ORDER BY を指定すると 簡単に累積を取得することができますが、現時点では SQL SERVER は SUM() に ORDER BY を指定することができません。

ですので、クエリーを駆使して累積を取得してみましょう。

まず、Sales1 テーブル同士で JOIN します。その際、「1つ目のテーブルの SalesDate が2つ目の SalesDate より同じか大きい」 という条件で結合します。

SELECT   S1.SalesDate,
         S1.SalesAmount AS SalesAmount1,
         S2.SalesAmount AS SalesAmount2
FROM     Sales1 AS S1
            INNER JOIN Sales1 AS S2
               ON S1.SalesDate >= S2.SalesDate
ORDER BY S1.SalesDate;

上記のクエリーの実行結果は以下のようになります。

クエリーの実行結果2

こちらを、 SalesDate、SalesAmount1 で GroupBy し、 SalesAmount2 の SUM() を計算すると累積になります。

SELECT   S1.SalesDate,
         S1.SalesAmount,
         SUM(S2.SalesAmount) AS CumulativeAmount
FROM     Sales1 AS S1
            INNER JOIN Sales1 AS S2
               ON S1.SalesDate >= S2.SalesDate
GROUP BY S1.SalesDate, S1.SalesAmount
ORDER BY S1.SalesDate;

累積を取得するクエリーの実行結果

累積を取得することができましたね。

次は SalesDate のほかにも SalesPerson の情報があり、 SalesPerson ごとの累積をとるケースをご説明したいと思います。

>> SQL で累積を取得する 2

SQL Server 関連のおすすめ書籍
ホーム > 便利なT-SQL&クエリー集 > SQL で累積を取得する 1