2017-10-12 12 views
2

Oracleでクエリを実行しようとしています。私は口座の決済のテーブルを持っている、私は最後の3つの決済された金額に加えて、私はこの情報が必要な任意の口座のために書かれた任意の金額を引き出すクエリを持っています。SQL Oracle /集約クエリ

しかし、アカウントの一部は週単位であり、これらのために週単位の決済を毎月のグループに集約したいと考えています。ここで私が持っているコードは、これまでのところです:

SELECT * 
FROM  (
    SELECT * 
    FROM (
      SELECT gwod.account_id, 
        gwod.charge_period_start, 
        SUM(gwod.total_due_on_charge) total_due_on_charge, 
        SUM(gwod.amount_written_off) amount_written_off, 
        DENSE_RANK() over (PARTITION BY gwod.account_id 
             ORDER BY charge_period_start DESC) rownumber 
      FROM  report.accounts_write_off gwod 
      WHERE account_id IN (‘account_number’) 
      GROUP BY gwod.account_id, 
        gwod.charge_period_start 
      HAVING SUM (gwod.total_due_on_charge) <> 0) t1 
    WHERE t1.rownumber <=3) 
    PIVOT (MAX(charge_period_start) charge_period, 
      MAX(total_due_on_charge) total_due_on_charge, 
      MAX(amount_written_off) amount_written_off 
      FOR rownumber IN (1,2,3)) 
ORDER BY account_id.* 

これは完全にはなく、毎週ベースのアカウントのために働く、そうではなく、決済された最後の週3つの量によって引っ張って、すなわち25-09-17、18-09 -17、11-09-2017、9月、8月、7月の合計支払い額を引き出したいと思います。

これはすべて意味があると思います。

答えて

0

単に内部クエリのSELECTEXTRACT(month ...)GROUP BYなどPARTITIONPIVOT句を月レベルに現在の単位レベル(すなわち、週次)から、あなたの凝集を変更します。

SELECT * 
FROM  (
    SELECT * 
    FROM (
      SELECT gwod.account_id, 
        EXTRACT(month FROM gwod.charge_period_start) charge_period_month, 
        SUM(gwod.total_due_on_charge) total_due_on_charge, 
        SUM(gwod.amount_written_off) amount_written_off, 
        DENSE_RANK() over (PARTITION BY gwod.account_id 
             ORDER BY EXTRACT(month FROM gwod.charge_period_start) DESC) rownumber 
      FROM  report.accounts_write_off gwod 
      WHERE account_id IN ('account_number') 
      GROUP BY gwod.account_id, 
        EXTRACT(month FROM gwod.charge_period_start) 
      HAVING SUM (gwod.total_due_on_charge) <> 0) t1 
    WHERE t1.rownumber <=3) 
    PIVOT (MAX(charge_period_month) charge_period, 
      MAX(total_due_on_charge) total_due_on_charge, 
      MAX(amount_written_off) amount_written_off 
      FOR rownumber IN (1,2,3)) 
ORDER BY account_id.* 

DEMO(ランダムでデータ)

http://rextester.com/UJK84858

+0

IヘクタールオラクルのMONTH()関数が見当たらないのですが、どこで見つけましたか? – mathguy

+0

Oracle DatabaseにMONTH()関数はありません。投稿したリンクはJAVADB用です。私はEXTRACT(...)を試す必要はありません。私はそれがうまくいくことを知っています - それはOracleでそれを行う正しい方法です。 – mathguy

+0

また、 "私"のテーブルがテストするのはどういう意味ですか?私はOPではない。 – mathguy