SQL 如果同一组中的另一个字段包含特定值,则乘以一个字段
SQL Multiply a field if another field in same group contains a certain value
我有一个小数据集
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 组中的 PCODE 为 N50,那么他们的 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 语句,但无法获得匹配的值。
你可以用解析函数来做到这一点:
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;
您可以使用 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')
此解决方案仅在主要 table 具有 'B10' 且第二个 table 具有 'N50' 时才使用左联接来获得匹配。
如果匹配:return PVAL 折扣为 N50 PVAL 的 5%。
如果不匹配: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'
我有一个小数据集
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 组中的 PCODE 为 N50,那么他们的 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 语句,但无法获得匹配的值。
你可以用解析函数来做到这一点:
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;
您可以使用 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')
此解决方案仅在主要 table 具有 'B10' 且第二个 table 具有 'N50' 时才使用左联接来获得匹配。 如果匹配:return PVAL 折扣为 N50 PVAL 的 5%。 如果不匹配: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'