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 
  日付

上記の手順を利用すれば、欠損している日付のデータも考慮した正確な全体の累積売上が得られます。

おすすめの記事