2015-08-06 21 views
6

Ich habe diese Tabelle in SQL Server:Gruppieren von Daten auf SQL Server

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

Wie kann ich die verschiedene Jahre und Monate um zwei weitere Spalten, die Gruppe das gleiche Jahr mit einer Zahl und dann verschiedene Monate in sequentiellen identifizieren Art und Weise wie das Beispiel

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 

Antwort

5

Sie DENSE_RANK verwenden können, um die Gruppen für Sie zu berechnen:

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 

Siehe hierzu fiddle.

0

Zur Gruppe und Untergruppe mit einer Reihe verbinden Sie dies tun können:

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 

Hier ROW_NUMBER() OVER Klausel berechnet innerhalb eines year Rang eines Monats. Und SUM() ... OVER berechnet mit Rang 1.

SQL Fiddle

+0

SUM für die Monate läuft es auf SQL 2008 funktionieren sollte? Was ist, wenn ich eine dritte Spalte gruppiere? es wird nicht richtig funktionieren? – cmonti

+0

funktioniert es auf SQL 2008 – Bulat

+0

Ich kann es nicht so in SQL Server 2008 – cmonti