2016-05-30 3 views
6

Miałem tabelę o nazwie calci. Poniższa było dane przykładowezatrzymany z jednym zapytaniem w SQL Server

CREATE TABLE calci 
    (RN int, FREQ int, price int) 
; 

INSERT INTO calci 
    (RN, FREQ, price) 
VALUES 
    (1, 1, 3), 
    (2, 2, 4), 
    (3, 3, 5), 
    (4, 4, 6), 
    (5, 5, 7), 
    (6, 6, 8), 
    (7, 1, 5), 
    (8, 2, 6), 
    (9, 3, 9), 
    (10, 4, 7), 
    (11, 5, 5), 
    (12, 6, 1), 
    (13, 1, 3) 
; 

ja wymagane tylko 3 rekordy na podstawie sumy freq (1-6)

Wynik powinien być podobny

price 
33 -----sum of first 6 records  
33 -----sum of next six records  
3 -----sum of last six record i.e last record 
+0

swoje dane przykładowe nie ma nawet 18 zapisów w nim. Jak chcesz obsłużyć tę sprawę? Jakie są tutaj "ostatnie" rekordy? –

+0

tak, nawet jeśli nie ma wystarczającej ilości rekordów, to powinna ich suma, np. W lasach mieliśmy tylko 4 rekordy, a ostatnie 4 rekordy powinny być wyświetlane suma – Smart003

Odpowiedz

2

sprawdź następujące zapytanie, które rozwiąże powyższy problem:

select sum(price) from calci group by (rn- freq) 
1
SELECT SUM(price) 
FROM calci 
GROUP BY (RN - 1)/6 
HAVING (RN - 1)/6 IN (0, 1) 
UNION 
SELECT SUM(price) 
FROM calci 
WHERE (RN - 1)/6 = (SELECT (COUNT(*) - 1)/6 FROM calci) 
+0

Jesteś zależny od tego, że nie będzie żadnych luk. – sagi

+0

Zróbmy to założenie, dopóki PO nie powie inaczej. –

1

myślę, że można użyć kwerendy tak:

;WITH t as (
    SELECT *, CASE WHEN LAG(FREQ) OVER (ORDER BY RN, FREQ) = 6 THEN 1 ELSE 0 END change 
    FROM calci 
), tt as (
    SELECT *, SUM(change) OVER (ORDER BY RN) grouped 
    FROM t) 

SELECT SUM(price) sumFreq 
FROM tt 
GROUP BY grouped; 

można zmienić change do CASE WHEN FREQ - LAG(FREQ) OVER (ORDER BY RN, FREQ) = 1 THEN 0 ELSE 1 END większą elastyczność, aby obsłużyć dowolny skok FREQ).

1

Try This

;WITH CTE (RN, FREQ, PRICE) AS 
    (
    SELECT 1, 1, 3 UNION ALL 
    SELECT 2, 2, 4 UNION ALL 
    SELECT 3, 3, 5 UNION ALL 
    SELECT 4, 4, 6 UNION ALL 
    SELECT 5, 5, 7 UNION ALL 
    SELECT 6, 6, 8 UNION ALL 
    SELECT 7, 1, 5 UNION ALL 
    SELECT 8, 2, 6 UNION ALL 
    SELECT 9, 3, 9 UNION ALL 
    SELECT 10, 4, 7 UNION ALL 
    SELECT 11, 5, 5 UNION ALL 
    SELECT 12, 6, 1 UNION ALL 
    SELECT 13, 1, 3 
    ), CTE2(PRICE, RANK) AS 
    (
    SELECT (PRICE) , DENSE_RANK() OVER (PARTITION BY FREQ ORDER BY RN) FROM CTE 
    ) 
    SELECT SUM(PRICE) FROM CTE2 GROUP BY RANK