2017-10-30 12 views
0

私は数百万行の大規模なデータベースで作業しています。私は効率的にクエリを実行しようとしています。データベースには、ローンのデフォルト(状態が「1」から「<> 1」に変わる)のローンポートフォリオの定期的なスナップショットが含まれています。それらが実行されると、対応するスナップショットには1回しか表示されず、報告されなくなります。私はそのようなローンの累計を取得しようとしています - それらは時間とともに発展し、起源国、ヴィンテージなどに応じて多くのバケツに分けられます。 SUM(...)その結果が、私は私が手SUM以上GROUP BY

Select 
assetcountry, edcode, vintage, aa25 as inclusionYrMo, poolcutoffdate, aa74 as status, 
AA16 AS employment, AA36 AS product, AA48 AS newUsed, aa55 as customerType, 
count(1) as Loans, sum(aa26) as OrigBal, sum(aa27) as CurBal, 
SUM(count(1)) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as LoanCountCumul, 
SUM(aa27) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as CurBalCumul, 
SUM(aa26) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as OrigBalCumul 
from myDatabase 
where aa22>='2014-01' and aa22<='2014-12' and vintage='2015' and active=0 and aa74<>'1' 
group by assetcountry, edcode, vintage, aa25, aa74, aa16, aa36, aa48, aa55, poolcutoffdate 
order by poolcutoffdate 

次のクエリを実行すると

SQLエラーそれは、集計関数またはGROUP BYのいずれかに含まれていないため(8120)コラムaa27は、選択リストでは無効です節

誰か光を当てることはできますか?おかげで私はあなたがしたいと考えてい

+0

ため

おかげで、この問題は、この上の任意の光を当てるん:https://stackoverflow.com/questions/10039431/how-can-i-use-sum-over – Dean

+4

であなたの質問にタグを付けますあなたが使っているデータベース。 –

答えて

0

Select assetcountry, edcode, vintage, aa25 as inclusionYrMo, poolcutoffdate, aa74 as status, 
     AA16 AS employment, AA36 AS product, AA48 AS newUsed, aa55 as customerType, 
     count(1) as Loans, sum(aa26) as OrigBal, sum(aa27) as CurBal, 
     SUM(count(1)) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as LoanCountCumul, 
     SUM(SUM(aa27)) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as CurBalCumul, 
     SUM(SUM(aa26)) OVER (ORDER BY [poolcutoffdate] ROWS UNBOUNDED PRECEDING) as OrigBalCumul 
from myDatabase 
where aa22 >= '2014-01' and aa22 <= '2014-12' and vintage = '2015' and 
     active = 0 and aa74 <> '1' 
group by assetcountry, edcode, vintage, aa25, aa74, aa16, aa36, aa48, aa55, poolcutoffdate 
order by poolcutoffdate; 

注累積合計式でSUM(SUM())

+0

集計内の集計は許可されていないと思いましたか?すなわちsum(sum())?このようなことをしようとすると、「集計やサブクエリを含む式に対して集計関数を実行できません」 – Simon

+0

洞察力に感謝しています。これは正しい方向への大きな一歩であり、エラーメッセージを取り除きます!)でも、GROUP BYバケットの変更ごとにゼロから開始することを期待していましたが、合計は進行し続けます。例えば。累積デフォルト値が従業員20人、自営業者30人の場合、この解決策では1つの総計が50 – GIG

+0

@GIGになります。 。 。バケツごとにグループ化すると1つの行が生成されるので、「進歩する」という意味は分かりません。おそらく、もう少し簡単なデータセットを使って別の質問をするべきでしょう。 –

0

これは私の研究結果を外部の研究データと比較することでわかりました。私は読みやすくするためのフィールドを単純化している :

select 
     poolcutoffdate, 
     count(1) as LoanCount, 
     MAX(sum(case status when 'default' then 1 else 0 end)) 
     over (order by poolcutoffdate 
      ROWS between unbounded preceding AND CURRENT ROW) as CumulDefaults 

from myDatabase 
group by poolcutoffdate 
order by poolcutoffdate asc 

私は、このように少なくとも一度は創業から現在の締め日に「デフォルト」状態にされているすべての融資を数えています。

結果が最初の行から現在の行までのさまざまな繰り返しのうち最大のものになるように、MAX(SUM())の使用に注意してください。 SUM(SUM())を使用すると、累積的な累積をもたらすさまざまな反復が追加されます。

「PARTITION BY poolcutoffdate」でSUM(SUM())を使用して、タリーが0から再開し、前のカットオフ日付から追加しないようにしましたが、これは最新のカットオフからのローンのみを含みます。デフォルト設定され、プールから削除された場合、間違ってカウントされません。

OVER文のCASEに注意してください。すべてのヘルプ