2015-11-05 3 views
5

ich eine Tabelle mit folgendem Inhalt in es in meiner SQL Server-Datenbank haben:Wählen Zeilen pro N und machen einen 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 

Was will ich tun nehmen Sie 3 Zeilen pro auswählen und SUM die Amount. Wenn die Summe der SUM0 ist, sollte es diese 3 Datensätze löschen. Ansonsten sollte es sie einfach in Ruhe lassen und die nächsten 3 Einträge machen und die gleichen Prüfungen durchführen.

In diesem Fall sollten nur die folgenden drei Datensätze aus der Tabelle gelöscht werden, da sie die einzigen sind, bei denen SUM0 ergeben würde.

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

Wie kann ich seine in SQL Server tun?

Antwort

6

Sie können ROW_NUMBER verwenden, um 3 Elementgruppen und Calucalte Summe zu erstellen.

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

Und mit 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

EDIT:

Wenn Ihre Daten negative Werte enthalten, können Sie verwenden können:

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

Dies funktioniert nur, wenn es passiert, dass die drei zusammenhängenden Beträge = 0 fallen in eine Partitionierungsgruppe, vorausgesetzt, ich verstehe die Frage – Mihai

+0

@Mihai Siehe aktualisiert – lad2025

Verwandte Themen