2017-02-22 8 views
0

プロジェクトテーブル

PID ProjectName Phase PhaseName Price 
16-A XYZ   1  Phase 1 $500 
16-A XYZ   2  Phase 2 $500 
16-A XYZ   3  Phase 3 $500 
17-A ZYX   1  Phase 1 $250 
17-A ZYX   2  Phase 2 $250 

私は

以下
PID ProjectName Phase PhaseName Price 
16-A XYZ   1  Phase 1 $500 
16-A XYZ   2  Phase 2 0 
16-A XYZ   3  Phase 3 0 
17-A ZYX   2  Phase 2 $250 
17-A ZYX   3  Phase 3 0 

のような所望の出力をしたいあなたは上記の表にサンプル所望の出力に見られるような、私は唯一の変動に一度のために$を表示したいので、基本的にPIDのコストは$ 500ですが、PIDには3つのバリエーション名があります。したがって、すべてのパターンに対して複数回の費用がかかると、費用レポートに余分な金額が表示されます。 これをフィルタリングする最良の方法は何ですか?

答えて

1

価格は常に同じで、その後、常にPhase 1がある場合:

select 
    PID 
    , ProjectName 
    , Phase 
    , PhaseName 
    , Price = case when Phase = 1 then Price else 0 end 
from t 

Phase 1が常に存在しない場合、私たちはそれぞれの最初のインスタンスに対してpriceを得ることができますPIDそのようrow_number()を使用して:

select 
    PID 
    , ProjectName 
    , Phase 
    , PhaseName 
    , Price = case when rn = 1 then Price else 0 end 
from (
    select * 
    , rn = row_number() over (
     partition by PID 
     order by Phase 
     ) 
    from t 
) as r 
+0

...で終わるこれは、私は常にすべてのPIDのためのフェーズ1があることを考える場合にのみ、私のために働いたが、ここでPIDはフェーズ3またはフェーズ2,3またはフェーズ1,2を持つことができます、3 – vap0991

0

が必要なのは、次のとおりです。

select 
     PID 
     ,ProjectName 
     ,Phase 
     ,PhaseName 
     ,case when (lag(Price,1) over (partition by PID order by Phase)) = Price 
      then 0 else Price end as Price 
    from project 

これは簡単です。あなたは

enter image description here

+1

これを 'Phase by PID order by partition'に変更するべきでしょう。 2つのプロジェクトの価格が同じ場合、コードは新しいプロジェクトの価格もゼロにします。 http://rextester.com/SSREC47137 – SqlZim

+0

優れた点、@SqlZim - 修正を加えました –

関連する問題