2017-02-24 73 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' 
相关问题