2015-11-05 16 views
5

Mam tabeli w mojej bazy danych SQL Server z następujących treści w nim:Wybierz wierszy na N i zrobić 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 

Co chcę zrobić, to wziąć 3 wierszy na wybranie i SUMAmount. Jeśli suma wartości SUM wynosi 0, powinna usunąć te 3 rekordy. W przeciwnym razie powinien po prostu zostawić ich w spokoju i wziąć kolejne 3 zapisy i wykonać te same kontrole.

W takim przypadku z tabeli powinny zostać usunięte tylko następujące trzy rekordy, ponieważ są one jedynymi, w których SUM może spowodować 0.

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

Jak mogę zrobić jego w SQL Server?

Odpowiedz

6

Możesz użyć ROW_NUMBER, aby utworzyć 3 grupy elementów i sumę calucalte.

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

I z 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:

Jeśli Twoje dane mogą zawierać wartości ujemne można użyć:

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

Zadziała tylko wtedy zdarza się, że 3 sąsiadujących Kwoty = 0 wpadają jedna grupa partycjonowania, zakładając, że rozumiem pytanie: – Mihai

+0

@Mihai See updated – lad2025

Powiązane problemy