月ごとの店舗別売上高を取得する以下のようなクエリがある。

SELECT
	sales_month
	, shop_id
	, sales_amount

FROM
	monthly_sales
;

この結果に、月ごとの全店舗の売上合計に占める各店舗の割合(全対比)を新しいカラムとして追加する方法を紹介する。

SUMウィンドウ関数

今回のような割合を計算する場合に有効なのがSUMウィンドウ関数だ。

先ほどのクエリを以下のように改変しよう。

SELECT
	sales_month
	, shop_id
	, sales_amount
	, CAST(sales_amount as real) / SUM(sales_amount) OVER (
		partition by sales_month
	) as sales_ratio
FROM
	monthly_sales
;

ポイントは5〜7行目。

まず、割合を計算するためsales_amountをreal型にキャストしている。
SQLは整数同士で除算すると小数が切り捨てられるため、これは必要な処理だ。

次にSUM関数の後にOVERと書かれているが、これがSUMウィンドウ関数となる。

partition byにグループ化する対象となるカラムsales_monthを指定しており、これによって月ごとの売上合計が算出され、各店舗の売上の全対比を算出することができる。

クエリを実行すると、上記のように全対比を得ることができた。