2015-08-06 35 views
6

mam tej tabeli w SQL Server:dane grupowanie SQL Server

Year Month  Quantity 
---------------------------- 
2015 January  10 
2015 February 20 
2015 March  30 
2014 November 40 
2014 August  50 

Jak mogę zidentyfikować różne latach i miesiącach dodając dwie kolejne kolumny, które grupa tych samych latach z numerem i następnie różne miesiące w sekwencyjny sposób jak w przykładzie

Year Month  Quantity Group Subgroup 
------------------------------------------------ 
2015 January  10   1  1 
2015 February 20   1  2 
2015 March  30   1  3 
2014 November 40   2  1 
2014 August  50   2  2 

Odpowiedz

5

można użyć DENSE_RANK obliczyć grup dla Ciebie:

SELECT t1.*, DENSE_RANK() OVER (ORDER BY Year DESC) AS [Group], 
    DENSE_RANK() OVER (PARTITION BY Year ORDER BY DATEPART(month, Month + ' 01 2010')) AS [SubGroup] 
FROM t1 
ORDER BY 4, 5 

Zobacz tę fiddle.

0

Aby skojarzyć grupę i podgrupę z numerem można to zrobić:

WITH RankedTable AS (
    SELECT year, month, quantity, 
    ROW_NUMBER() OVER (partition by year order by Month) AS rn 
    FROM yourtable) 
SELECT year, month, quantity, 
    SUM (CASE WHEN rn = 1 THEN 1 ELSE 0 END) OVER (ORDER BY YEAR) as year_group, 
    rn AS subgroup 
FROM RankedTable 

Tutaj ROW_NUMBER() OVER klauzula wylicza rangi miesiąc w year. I SUM() ... OVER oblicza działa SUM dla miesięcy z rangi 1.

SQL Fiddle

+0

powinien działać na SQL 2008? co jeśli mam trzecią kolumnę do grupowania? to nie będzie działać poprawnie? – cmonti

+0

działa na SQL 2008 – Bulat

+0

Nie mogę sprawić, żeby działało tak w serwerze sql 2008 – cmonti