2017-12-29 31 views
0

特定の条件に基づいて行を分類するプロセスに悩まされています。私は皆さんからのご支援を得て、これを手に入れたいと思っています! 基本的には、いくつかの特定の数式を適用してテーブルに2つの新しい列を作成しようとしています。これらの列は、各年のボリュームのランキングと、top 3 claimsに含まれる各プラクが2014またはnotに含まれるかどうかを指定することによって分類するための列です。以下の例では、light blueで強調表示されている列が作成したい列です。oracle sqlのランキングと条件文でのカウント

enter image description here 私のクエリは以下の通りです - 今、私はそれらの括弧内で動作していないようfromgroup byhaving上記の二つの最後の行のための書き込みコードに問題があります。助けてください!!

元のデータが欠落してい
select  
    fiscal_year, 
    prac, 
    count(*) "CLAIMS", 
    sum(paid_amount) "COST", 
    row_number() over (group by fiscal_year order by count(*) desc) "Annual Rank by Claims", 
    case 
     when row_number() over (having fiscal_year = '2014' order by count(*) desc) < 4 
     then 'YES' 
     else 'NO' 
    end "PRAC TOP 3 IN CLAIMS 2014"  
from mys.mv_claim 
where category = 'V' 
group by fiscal_year, 
    prac 

/
+0

画像の列に基づいて、COSTに基づいて各年内にランクを作成します。そうですか? – Vashi

+0

こんにちは、私はCLAIMSに基づいて毎年ランクをつけたいと思っています。ありがとうございました! – SanK

+0

"DI"、 "FO"、 "SN"はそれぞれ年に2回表示されています。 "DI"と "FO"の場合、 "PRAC TOP 3 IN CLAIMES 2014"は3回 "YES"と3回 "NO"となります。あなたはどうやってこれらを分けているのですか? – Abecee

答えて

0

私はパーティション分割仕様でGROUP BYとHAVINGを使用したことはありません。私はそれが構文エラーだと思う。二つの同一の請求数が同じランク値が生成されますよう

WITH t as (
select  
    fiscal_year, 
    prac, 
    count(*) "CLAIMS", 
    sum(paid_amount) "COST" 
from mys.mv_claim 
where category = 'V' 
group by fiscal_year, prac 
) 
SELECT 
    t.*, 
    rank() over (partition by fiscal_year order by claims desc) "Annual Rank by Claims", 
    case 
    when prac in(select prac from (select * from t where fiscal_year = 2014 order by claims desc) where rownum <= 3) 
    then 'YES' 
    else 'NO' 
    end "PRAC TOP 3 IN CLAIMS 2014" 
from t 

私は、代わりに行番号のランクを使用しました:私はあなたのクエリがより見えるように必要だと思います。ランクは次のランクをスキップします(2つの999クレームカウントはそれぞれ1ランク、998クレームカウントは3ランクになります)。

これで何かエラーが発生した場合は、私が確信している唯一のことは、上位3つのプラクを取り出す副次的な選択だからです。代わりに左結合を使用することができます(私はより大きな自信があります)

+0

これは魔法のように機能します。ありがとう、カイウス!!! – SanK

0

、出発点で与えられた(中間)出力を聞かせて - (MV_Claim_Ranked結果として)最初のステートメントは、mys.mv_claimからあなたの選択で置き換えることができます

WITH 
MV_Claim_Ranked AS (
SELECT 
    fiscal_year, 
    prac, 
    claims, 
    cost, 
    annual_rank_by_claim, 
    RANK() OVER (PARTITION BY fiscal_year ORDER BY claims DESC) annual_rank_by_claim_calc, 
    prac_top_3_in_claims_2014 
FROM MV_Claim_Grouped 
) 
SELECT 
    T1.*, 
    CASE WHEN (SELECT annual_rank_by_claim_calc 
      FROM MV_Claim_Ranked T2 
      WHERE T1.prac = T2.prac 
       AND T2.fiscal_year = 2014) < 4 
     THEN 'YES' ELSE 'NO' END AS prac_top_3_in_claims_2014_calc 
FROM MV_Claim_Ranked T1 
ORDER BY prac, fiscal_year 
; 

あなたの集計は参照用に保持されています。

実際にはSQL Fiddleをご覧ください。

調整や詳細が必要な場合は、コメントしてください。