sqlserver-如何根据字段值删除行,但如果某些其他字段值不存在则不删除



我正在为我的企业制作财务报告表,并试图将数据"按摩"成母公司想要读取的内容。我非常接近。

本质上,我有这个:

Account FPeriod    Balance
   1          0      42
   1          1      53
   1          2      11
   2          0      62
   3          0     567
   3          1     564
   3          2      34

其中,每个帐户都有多行,每个会计期间都有一行。会计期间0表示该会计年度的帐户期初余额。

我需要做的是删除会计期间为0的行,但如果它是该帐户的唯一条目,则不删除。

我做过:

Delete from TABLE  
WHERE Fperiod = 0

但这删除了FPeriod为0的所有行,例如,我需要保留帐户2 FPeriod 0,因为它是该帐户的唯一条目。我确实需要删除帐户1和3 FPeriod 0行。

我甚至不知道从哪里开始,想着也许会循环一段时间?我听说如果你能避开它们,那就太糟糕了。

我需要这样的输出:

Account FPeriod    Balance
       1          1      53
       1          2      11
       2          0      62
       3          1     564
       3          2      34

有什么想法吗?

;with cteBase as (
Select * 
      ,RowNr=Row_Number() over (Partition By Account Order By FPeriod Desc)
 From YourTable 
) 
Select * From cteBase where RowNr>1 and FPeriod=0
-- Delete From cteBase where RowNr>1 and FPeriod=0 

如果您对结果感到满意,请使用Delete 切换最终选择

从您的样本中,这两条记录将被删除

Account FPeriod Balance 
1       0       42      
3       0       567     
DELETE FROM TABLE  
WHERE Fperiod = 0
AND EXISTS (SELECT 1 
            FROM TABLE t1 
            WHERE t1.Account = TABLE.Account 
             AND  t1.FPeriod > 0)

最新更新