2017-02-24 50 views
1

我有一個小數據集SQL乘以一個字段,如果在同一組中的另一個字段包含一定值

SELECT PID, PCODE, PVAL 
FROM mytable 

輸出:

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 

我要輸出的相同的字段,除了當PID團隊中有一個N50的PCODE,那麼他們的B10需要像這樣減少5%的N50。

預期輸出:

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。

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」和第二張桌子有'N50'。 如果匹配:返回PVAL打折5%的N50 PVAL。 如果不匹配:return 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' 
相關問題