t-sql - 按聚合值删除行

标签 t-sql sql-delete

我有一个包含详细行的表。我们希望针对该表中的聚合值进行交易。可能存在这样的情况:一行为正,另一行为负。总计为 0。我想删除这些行。

这是我的例子:

DECLARE @tmp TABLE ( orderid INT
,                    account INT
,                    vatid   INT
,                    amount  DECIMAL(10,2)
,                    vat     DECIMAL(10,2) )

--test values
INSERT @tmp
VALUES ( 10001, 30500, 47, 175.50,  9.20  )
,      ( 10001, 30501, 47, 2010.60, 18.30 )
,      ( 10001, 30501, 47, 147.65,  8.05  )
,      ( 10001, 30502, 47, 321.15,  18.40 )
,      ( 10001, 30502, 47, 13.50,   0.95  )
,      ( 10001, 30510, 40, 15.00,   0.0   )
,      ( 10001, 30510, 40, -15.00,  0.0   )

--all rows
SELECT * FROM @tmp

--aggregate
  --aggregate for account 30510 is 0
SELECT tmp.orderid    
,      tmp.account    
,      tmp.vatid      
,      SUM(tmp.amount) [totalamount]
,      SUM(tmp.vat)    [totalvat]
FROM @tmp tmp
GROUP BY tmp.orderid
,        tmp.account
,        tmp.vatid

--delete rows with aggregated values 0
DELETE tmp
FROM @tmp tmp 
JOIN (
    SELECT ag.orderid
    ,      ag.account
    ,      ag.vatid
    FROM (
        SELECT tmp.orderid    
        ,      tmp.account    
        ,      tmp.vatid      
        ,      SUM(tmp.amount) [totalamount]
        ,      SUM(tmp.vat)    [totalvat]
        FROM @tmp tmp
        GROUP BY tmp.orderid
        ,        tmp.account
        ,        tmp.vatid
        ) ag
    WHERE ISNULL(ag.totalamount,0) = 0
        AND ISNULL(ag.totalvat,0) = 0
    )         tmp2
    ON tmp2.orderid = tmp.orderid
    AND tmp2.account = tmp.account
    AND tmp2.vatid = tmp.vatid

--check rows
SELECT * FROM @tmp

我的代码可以运行并删除聚合值为 0 的行。

但是看起来不太优雅。有没有更好的方法来达到相同的结果?

问候雷托

最佳答案

使用window function

delete tt
from (  select sum(t.vat)    over (partition by t.orderid, t.account, t.vatid) as sumVat
             , sum(t.amount) over (partition by t.orderid, t.account, t.vatid) as sumAmt
          from @tmp t 
     ) tt 
where isnull(tt.sumAmt, 0) = 0 
  and isnull(tt.sumVat, 0) = 0

关于t-sql - 按聚合值删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49407064/

相关文章:

sql - 将 Nvarchar(max) 转换为 nvarchar 的最佳/最有效方法 (30)

t-sql - 如果文字不包含通配符,为什么我不能用 col <> 文字替换 ISNULL(col,literal) NOT LIKE 文字?

c# - 删除查询中的内部连接有那么糟糕吗?

mysql - 删除 MySQL 中的重复行

Postgresql:按 CompanyID 和 CustomerID 删除重复记录

sql - 捕获连接表达式中的所有记录

t-sql - 全文搜索 CONTAINS 子句是否始终被评估?

sql - SQL 中嵌套事务的回滚抛出错误

sql-server-2008-r2 - 无法从 CTE 中删除 - MSG 4405

sql - 如何删除表中没有FK关系的所有行