sql >> データベース >  >> RDS >> Oracle

Oracleの条件付きSUM

    再帰SQLの代わりに、SQL MODELを使用することもできます。 句。個人的には、これは再帰SQLよりも少し読みやすいと思いますが、書くのは難しいです(私のようなほとんどの人は、構文を調べる必要があるためです)。

    -- "test_data" is just a substitute for your real table, which I don't have
    -- it is just so people without your table can run this example and would
    -- not be part of your real solution.
    with test_data ( sort_col, addend ) as
    ( SELECT 'A', 3 FROM DUAL UNION ALL
     SELECT 'B', 7 FROM DUAL UNION ALL
     SELECT 'C', 6 FROM DUAL UNION ALL
     SELECT 'D', 5 FROM DUAL UNION ALL
     SELECT 'E', 9 FROM DUAL UNION ALL
     SELECT 'F', 3 FROM DUAL UNION ALL
     SELECT 'G', 8 FROM DUAL ),
    -- Solution begins here
    sorted_inputs ( sort_col, sort_order, addend, running_sum_max_15) as
    ( SELECT sort_col, row_number() over ( order by sort_col ) sort_order, addend, 0 from test_data )
    SELECT sort_col, addend, running_sum_max_15
    from sorted_inputs
    model 
    dimension by (sort_order)
    measures ( sort_col, addend, running_sum_max_15 )
    rules update
    ( running_sum_max_15[1] = addend[1],
      running_sum_max_15[sort_order>1] = 
              case when running_sum_max_15[CV(sort_order)-1] < 15 THEN 
                 running_sum_max_15[CV(sort_order)-1] ELSE 0 END+addend[CV(sort_order)]
    )
    

    結果

    +----------+--------+--------------------+
    | SORT_COL | ADDEND | RUNNING_SUM_MAX_15 |
    +----------+--------+--------------------+
    | A        |      3 |                  3 |
    | B        |      7 |                 10 |
    | C        |      6 |                 16 |
    | D        |      5 |                  5 |
    | E        |      9 |                 14 |
    | F        |      3 |                 17 |
    | G        |      8 |                  8 |
    +----------+--------+--------------------+
    


    1. SQLGROUPBY-プロのように結果をグループ化するための3つの簡単なヒント

    2. MySQL5.7で厳密なSQLモードを無効にする方法

    3. SQL Server(T-SQL)のmsdbデータベースからデータベースメールメッセージを削除する

    4. 9つの最も一般的なデータベース設計エラー