2015-11-05 25 views
5

我有一个表中有下列内容:每n选择行做我的SQL Server数据库的SUM

Date  | Amount 
------------|---------- 
2012-12-17 | 9.00 
2012-12-18 | 8.00 
2012-12-19 | 0.00 
2012-12-20 | 1.50 
2012-12-21 | 2.50 
2012-12-22 | 0.00 
2012-12-23 | 0.00 
2012-12-24 | 0.00 
2012-12-25 | 0.00 
2012-12-26 | 4.00 
2012-12-27 | 2.00 
2012-12-28 | 7.00 

我想要做的就是采取每选择3行SUMAmount。如果SUM的总数为0,则应删除这3条记录。否则,它应该让他们独自一人,并采取接下来的3条记录,并进行相同的检查。

所以在这种情况下,只有以下三条记录应从表格中删除,因为它们是SUM导致0的唯一的记录。

2012-12-23 | 0.00 
2012-12-24 | 0.00 
2012-12-25 | 0.00 

我该如何在SQL Server中做他?

回答

6

您可以使用ROW_NUMBER来制作3个元素组和calucalte sum。

WITH cte AS 
(
    SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1)/3 
    FROM #tab 
), cte2 AS 
(
    SELECT *, [sum] = SUM(Amount) OVER (PARTITION BY rn ORDER BY [Date]) 
    FROM cte 
) 
SELECT * 
FROM cte2 
WHERE [sum] = 0; 

LiveDemo

而且随着DELETE

WITH cte AS 
(
    SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1)/3 
    FROM #tab 
), cte2 AS 
(
    SELECT *, [sum] = SUM(Amount) OVER (PARTITION BY rn ORDER BY [Date]) 
    FROM cte 
) 
DELETE t 
FROM #tab t 
JOIN cte2 c 
    ON t.[Date] = c.[Date] 
WHERE [sum] = 0; 

SELECT * 
FROM #tab; 

LiveDemo2

编辑:

如果您的数据可以包含负值,你可以使用:

WITH cte AS 
(
    SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1)/3 
    FROM #tab 
), cte2 AS 
(
    SELECT rn, [sum] = SUM(Amount) 
    FROM cte 
    GROUP BY rn 
) 
SELECT c.* 
FROM cte c 
JOIN cte2 c2 
    ON c.rn = c2.rn 
WHERE [sum] = 0; 

LiveDemo3

+0

这只能如果它发生了3倍连续的金额= 0落入一个分区组,假设我理解 – Mihai

+0

@Mihai的问题See updated – lad2025