2015-11-05 14 views
5

Ben bir tablo var bir SUM yapın:satırları seçin ve içinde aşağıdaki içeriği ile benim SQL Server veritabanında

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 

Ne yapmak istiyorum 3 seçme başına satır ve SUMAmount atmak. SUM toplamı 0 ise, o zaman bu 3 kaydı silmeli. Aksi takdirde onları yalnız bırakmalı ve sonraki 3 kayıtları almalı ve aynı kontrolleri yapmalıdır.

Bu durumda, SUM'un 0 ile sonuçlanabildiklerinden yalnızca aşağıdaki üç kayıt tablodan silinmelidir.

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

SQL Server'da nasıl yapabilirim?

cevap

6

3 element grubu ve calucalte toplamı yapmak için ROW_NUMBER kullanabilirsiniz. LiveDemo

Ve DELETE ile

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; 

:

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

DÜZENLEME: Verilerinizi negatif değerler içerebilir Eğer

kullanabilirsiniz:

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

Bu yalnızca eserlerini bu olur eğer 3 bitişik tutarlar = içine 0 güz Bir bölümleme grubu, – Mihai

+0

@Mihai sorununun anlaşıldığını varsayarak güncellendi – lad2025

İlgili konular