2015-08-06 6 views
6

У меня есть эта таблица в SQL Server:Группировка данных по SQL Server

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

Как я могу определить различные годы и месяцы, добавив еще два столбца этой группы в те же годы с номером, а затем разные месяцы в последовательном способ, как, например

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 

ответ

5

Вы можете использовать DENSE_RANK вычислить группы для вас:

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 

См. Это fiddle.

0

Чтобы связать группу и подгруппу с номером вы можете сделать это:

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 

Здесь ROW_NUMBER() OVER положение вычисляет ранг месяц в year. И SUM() ... OVER расчитывает работает SUM в течение месяцев с рангом 1.

SQL Fiddle

+0

он должен работать на SQL 2008? что, если у меня есть третий столбец для группировки? это не сработает? – cmonti

+0

он работает на SQL 2008 – Bulat

+0

Я не могу заставить его работать так, как в sql server 2008 – cmonti