LoginSignup
rect8530
@rect8530

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SQLのOVER PARTITION BYの使い方について教えてください。

SQL初心者です。
OVER PARTITION BYの使い方について、ご教授ください。
環境:oracleSQL
やりたいこと:
CASE式を用いたうえで、各日の残高を出力するSQLを記載したい
残高A-(②3/10の取引SQL)-(③3/12の取引SQL)=③3/12の残高

      +側    -側    残高
 ---------------------------------------------------
①残高              30,000
②3/10   +10000        残高30,000+10,000
③3/12       -5000    3/10の残高40,000-5,000
以降、同様

①残高 30,000 '残高A'(解決済)
②3/10 残高30,000に10,000を加算 '残高B'
③3/12以降 OVER(PARTITION BY 集約条件Z) を使用して各日の残高を出す。'3/12の残高'

②③はタイプにより、下記のように分岐(条件がELSEの場合、±側を逆に差引)
CASE WHEN タイプ IN ('X','Y') THEN
NVL(プラス側,0) - NVL(マイナス側,0)
ELSE
NVL(マイナス側,0) - NVL(プラス側,0)
END)

悩んでいること
SUM(NVL(プラス側,0) - NVL(マイナス側,0)) OVER(PPARTITION BY集約条件Z)では②③の残高が出ないが、
SUMなどの集約関数を使わないとOVER PPARTITION BY句がエラーになる。

②、③のSQLが別のSQL文になる場合は、分けてご教授いただけるとありがたいです。
よろしくお願いします。

0

1Answer

問題を細かく分割し、共通テーブル式で記述することで、見通しが良くなります。
最後の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

https://livesql.oracle.com/ にて確認

0Like

Your answer might help someone💌