2017-02-24 4 views
1

が含まれている場合、私は小さなデータがSQL乗算フィールド同じグループ内の別のフィールドが特定の値

SELECT PID, PCODE, PVAL 
FROM mytable 

出力設定があります。出力に私はしたいPID場合を除き、同じフィールドを

PID PCODE PVAL 
2 N50 £1,000.00 
2 B10 £100.00 
2 P40 £500.00 
3 B10 £100.00 
3 P40 £500.00 
4 B10 £100.00 
4 P40 £500.00 

をグループ内にN50のPCODEがある場合、そのようにB10をN50の5%減らす必要があります。

予想される出力:

PID PCODE PVAL 
2 N50 £1,000.00 
2 B10 £50.00 
2 P40 £500.00 
3 B10 £100.00 
3 P40 £500.00 
4 B10 £100.00 
4 P40 £500.00 

私は、このためにサブクエリやcase文を使用して試してみましたが、値が一致して取得傾けます。

答えて

1

あなたがこれを行うにはcase発現とmax機能を使用することができます。これはpidがpcode = N50の行を1つしか持てないことを前提としています。

select pid,pcode 
,case when pcode='B10' then pval-0.05*max(case when pcode='N50' then pval else 0 end) over(partition by pid) 
else pval end as pval 
from mytable t 

編集:B10のコードが含まれている年に結果を制限するための一つの方法は、このソリューションは、左を使用しています

select pid,pcode 
,case when pcode='B10' then pval-0.05*max(case when pcode='N50' then pval else 0 end) over(partition by pid) 
else pval end as pval 
from mytable t 
where yearcolumn in (select yearcolumn from mytable where pcode='B10') 
1

あなたは分析関数でこれを行うことができます。

SELECT PID, PCODE, 
     (PVAL - 
     COALESCE(SUM(CASE WHEN PCODE = 'N50' THEN PVAL * 0.05 END) OVER (PARTITION BY PID), 0) 
     ) as PVAL 
FROM mytable; 

を実際に、COALESCE()は必要ありません。

SELECT PID, PCODE, 
     (PVAL - 
     SUM(CASE WHEN PCODE = 'N50' THEN PVAL * 0.05 ELSE 0 END) OVER (PARTITION BY PID) 
     ) as PVAL 
FROM mytable; 
+0

これらはいずれもB10フィールドには何もしません – Matt

1

がメインテーブルには「B10」を持っている場合にのみ、一致を得るために参加し、 2番目のテーブルには 'N50'があります。 一致するものがある場合:N50 PVALの5%割引PVALを返します。 一致するものがない場合:返品PVAL

SELECT t1.PID, T1.PCODE, t1.PVAL - isnull(.05 * t2.PVAL, 0) PVAL 
    FROM mytable t1 
    left join #mytable t2 
     on t1.PID = t2.PID and t1.PCode = 'B10' and t2.PCode = 'N50' 
関連する問題