我有一个包含详细行的表。我们希望针对该表中的聚合值进行交易。可能存在这样的情况:一行为正,另一行为负。总计为 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 的行。
但是看起来不太优雅。有没有更好的方法来达到相同的结果?
问候雷托
最佳答案
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/