WITH date_range AS (
-- データの最小日付から最大日付までの連続した日付を生成
SELECT
DATE(d) AS date
FROM
UNNEST(GENERATE_DATE_ARRAY(
(SELECT MIN(DATE(日付)) FROM dataset.table),
(SELECT MAX(DATE(日付)) FROM dataset.table),
INTERVAL 1 DAY
)) AS d
)
, product_dates AS (
-- ユニークな商品IDのリストを作成
SELECT
DISTINCT 商品ID
FROM
dataset.table
)
, all_combinations AS (
-- 全ての日付と商品IDの組み合わせを生成
SELECT
date, 商品ID
FROM
date_range
CROSS JOIN
product_dates
)
, filled_data AS (
-- 元のデータと全ての組み合わせを結合し、欠損している日付のデータを0で埋める
SELECT
ac.date AS 日付,
ac.商品ID,
COALESCE(t.売上, 0) AS 売上
FROM
all_combinations ac
LEFT JOIN
dataset.table t
ON ac.date = DATE(t.日付)
AND ac.商品ID = t.商品ID
)
, cumulative_sales AS (
-- 各商品ごとに累積売上を計算
SELECT
日付,
商品ID,
売上,
SUM(売上) OVER (PARTITION BY 商品ID ORDER BY 日付) AS 累積売上
FROM
filled_data
)
-- 全商品の累積売上を日付ごとに合計し、「全体」として集計
SELECT
日付,
'全体' AS 商品ID,
SUM(累積売上) AS 累積売上
FROM
cumulative_sales
GROUP BY
日付
ORDER BY
日付
上記の手順を利用すれば、欠損している日付のデータも考慮した正確な全体の累積売上が得られます。




