2015-08-06 14 views
6

Ho questa tabella in SQL Server:Raggruppamento dei dati in SQL Server

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

Come posso identificare i diversi anni e mesi aggiungendo altre due colonne del gruppo stessi anni con un numero e poi diversi mesi in sequenziale modo come l'esempio

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 

risposta

5

È possibile utilizzare DENSE_RANK per calcolare i gruppi per voi:

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 

Vedere questo fiddle.

0

Per associare gruppo e sottogruppo con un numero che si può fare questo:

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 

Qui ROW_NUMBER() OVER clausola calcola rango di un mese all'interno di un year. E SUM() ... OVER calcola esecuzione SUM per i mesi con rango 1.

SQL Fiddle

+0

dovrebbe funzionare su SQL 2008? cosa succede se ho una terza colonna da raggruppare? non funzionerà correttamente? – cmonti

+0

funziona su SQL 2008 – Bulat

+0

Non riesco a farlo funzionare in SQL Server 2008 – cmonti