2017-07-18 7 views
0

私は、下の画像に示す結果を生成するビューを持っています。私は論理の助けが必要です。条件付きの値と欠落していないレコードを含むレコードを一覧表示する方法

要件:過去2年間にすべての四半期でなし100%未満目標を達成し、全従業員の 一覧。

B」は、2つの異なる四半期で90%を受け取った。 100%未満を受け取った従業員はリストに載せてはいけません。
Q2-2016で "A"が機能しなかったことに注目してください。その四半期に勤務しなかった従業員はリストに載らないようにしてください。
"C"は、2年間完全に働いた唯一の人であり、各四半期ごとに100%受け取りました。

編集:従業員名、四半期、年、およびスコアを示す画像リンクが追加されました。 https://i.imgur.com/FIXR0YF.png

答えて

0

ロジックは非常に簡単ですが、それは四分の一の数学であり、少しの痛みです。

過去2年間に8つの四半期があるため、過去2年間のすべての従業員名をターゲット> = 100%で選択し、従業員名でグループ化し、HAVING句を適用してcount(*) = 8で従業員に出力します。

現在の年と四半期を取得するには、あなたがこれらの式を使用することができます:前年と四半期を見つけるために現在の年から

cast(extract('year' from current_date) as integer) as yr, 
(cast(extract('month' from current_date) as integer)-1)/3 + 1 as quarter; 

減算2。これらの式をサブクエリに入れると、四半期の計算に複数回必要となるため、コードが明確になります。四分円算術演算を行うには、保存したテキスト値から四分円の整数値を抽出する必要があります。

要するに、解決策は次のようになります。

select 
    employee 
from 
    (select employee, cast(right(quarter,1) as integer) as qtr, year 
     from your_table 
     where target >= 100 
     ) as tgt 
    cross join (
     select 
      cast(extract('year' from current_date) as integer) as yr, 
      (cast(extract('month' from current_date) as integer)-1)/3 + 1 as quarter 
     ) as qtr 
where 
    tgt.year between qtr.yr-1 and qtr.yr 
    or (tgt.year = qtr.yr - 2 and tgt.qtr > qtr.quarter) 
group by 
    employee 
having 
    count(*) = 8; 

これはテストされていません。

あなたはPostgresのを使用することが起こると四半期演算をたくさんやっていることを期待する場合は、A Year and Quarter Data Type for PostgreSQL

で説明したようにカスタムデータ型を定義することもできます
関連する問題