問題を細かく分割し、共通テーブル式で記述することで、見通しが良くなります。
最後のFROM句を変えることで、各共通テーブル式の結果を確認することができます。
WITH サンプル AS (
SELECT '2024-03-01' 取引日, 30000 プラス側, NULL マイナス側, 'X' タイプ FROM DUAL
UNION ALL SELECT '2024-03-10', 10000, NULL, 'Y' FROM DUAL
UNION ALL SELECT '2024-03-12', NULL, 5000, 'X' FROM DUAL
UNION ALL SELECT '2024-03-13', 10000, NULL, 'A' FROM DUAL
UNION ALL SELECT '2024-03-14', NULL, 5000, NULL FROM DUAL
UNION ALL SELECT '2024-03-14', 9000, 8000, NULL FROM DUAL
UNION ALL SELECT '2024-03-15', 6000, 7000, NULL FROM DUAL
),
NULL置換 AS (
SELECT
取引日,
COALESCE(プラス側, 0) AS プラス側,
COALESCE(マイナス側, 0) AS マイナス側,
タイプ
FROM
サンプル
),
差引額計算 AS (
SELECT
NULL置換.*,
CASE
WHEN タイプ IN ('X', 'Y') THEN プラス側 - マイナス側
ELSE マイナス側 - プラス側
END AS 差引額
FROM
NULL置換
),
残高計算 AS (
SELECT
差引額計算.*,
SUM(差引額) OVER(ORDER BY 取引日) 残高
FROM
差引額計算
)
SELECT * FROM 残高計算
結果
取引日 | プラス側 | マイナス側 | タイプ | 差引額 | 残高 |
---|---|---|---|---|---|
2024-03-01 | 30000 | 0 | X | 30000 | 30000 |
2024-03-10 | 10000 | 0 | Y | 10000 | 40000 |
2024-03-12 | 0 | 5000 | X | -5000 | 35000 |
2024-03-13 | 10000 | 0 | A | -10000 | 25000 |
2024-03-14 | 9000 | 8000 | NULL | -1000 | 29000 |
2024-03-14 | 0 | 5000 | NULL | 5000 | 29000 |
2024-03-15 | 6000 | 7000 | NULL | 1000 | 30000 |