2014-07-19 21 views
0

**模式&數據集**

ID版本支付名
1110富
2 1 0大衛
3 1 10馬克
4 1 10爾傑斯
5 1 0 SteffT-SQL INSERT 2008虛擬行時條件滿足

1 2 10富
2 2 0大衛
馬克
4個2個10個爾傑斯
5 2 0 Steff

2 3 0大衛
3 3 10馬克
4個3個10個爾傑斯

http://sqlfiddle.com/#!3/1c457/18 - 包含我的模式和我正在使用的數據集。

背景

上述數據是在最後一組後,存儲的過程做了它的處理,上述一切都是在一個表中,不幸的是我不能改變它。

我需要在數據集中識別一個人在以前的版本中支付總額大於0的情況下刪除了一個人,並插入一個付款爲0的虛擬行。因此,在上面的示例中,Rich已被刪除3以前的版本總共支付10。我需要首先確定在所有情況下發生了這種情況,併爲該版本插入一個支付金額爲0的虛擬行。 Steff在版本3中也被刪除,但她在以前的版本中沒有超過0的付款,所以她不需要虛擬行。

試過到目前爲止 - 所以我看着皮納爾Dave的例子here,我可以看回以前的行這是偉大的,因此是朝着正確方向邁出的一步。但我不確定如何去實現上述要求。我一直在玩弄一個案例陳述的想法,但我不確定這將是最好的解決方案。我真的很困擾這個問題,並希望得到一些關於如何解決這個問題的建議。

+0

如果您的問題更爲具體,並且包含代碼或您嘗試過的圖示,您會得到更好的答案和結果。另外,雖然場外鏈接並不可怕,但如果它們消失了,那意味着你的問題會失去很多價值,因爲人們再也看不到你的模式。您可能想要編輯您的問題(請參閱「幫助」區域中提問問題的指導),以提高獲得答案的機會。 –

+0

謝謝你。我編輯了我的問題,現在也提供了上面的模式。 – Rich

回答

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小提琴。

+0

完美。這似乎有伎倆。非常感謝。 – Rich