满足T-SQL 2008 INSERT虚拟行WHEN条件

时间:2014-07-19 11:51:01

标签: sql sql-server-2008 tsql

**架构 & 数据集**

id版本付款名称
1 1 10富有 2 1 0大卫
3 1 10 Marc
4 1 10 Jess
5 1 0 Steff

1 2 10富有 2 2 0大卫
3 2 10 Marc
4 2 10 Jess
5 2 0 Steff

2 3 0大卫
3 3 10 Marc
4 3 10 Jess

http://sqlfiddle.com/#!3/1c457/18 - 包含我的架构和我正在使用的数据集。

背景

上面的数据是存储过程完成处理后的最终设置,所以上面的所有内容都在一个表中,不幸的是我无法更改它。

我需要在数据集中标识某个人在之前的版本中已删除的支付总额大于0,并插入一个支付为0的虚拟行。因此在上面的示例中,Rich已在版本3中删除以前版本的付款总额为10。我需要首先确定在所有实例中发生这种情况的位置,并插入一个虚拟行,并为该版本支付0。 Steff也已在版本3中删除,但她之前的版本没有超过0的付款,因此她不需要虚拟行。

到目前为止尝试 - 所以我看了pinal dave的例子here,我可以回顾前一行很好,所以这是朝着正确方向迈出的一步。但我不确定如何实现上述要求。我一直在研究案例陈述的想法,但我不确定这是最好的方法。我真的很挣这个,并希望得到一些如何解决它的建议。

1 个答案:

答案 0 :(得分:0)

您可以通过生成名称和版本的所有可能组合来完成此操作。然后根据付款条件过滤掉你不想要的那些:

select n.name, v.version, coalesce(de.payment, 0) as payment
from (select name, max(payment) as maxpay from dataextract group by name) n cross join
     (select distinct version from dataextract) v left outer join
     dataextract de
     on de.name = n.name and de.version = v.version
where de.name is not null or n.maxpay > 0;

Here是一个SQL小提琴。