2015-05-15 4 views
2

имеет таблицу, как показано ниже, где мне нужно взять сумму col2 на основе группы. Но он принадлежит цепочке, если цепь прерывается, тогда сумма будет ограничена последовательностью.Группа по вхождению строки

DECLARE @TabVar TABLE 
(
    ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT 
) 
INSERT INTO @TabVar 
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3) 

SELECT * FROM @TabVar 

Expected output: 
    COL1  SUM(COL2) 
    A   5 
    B   6 
    A   9 
    B   3 

Я пытался сделать это с Рейтинге функций, но ранжирование осуществляется с помощью Order, по которому аккумулировать в общей сложности Col1

ответ

2

Вы можете использовать ROW_NUMBER() с PARTITION BY, а затем GROUP BY для достижения этой цели.

Всякий раз, когда ваша цепь разрывается, id - ROW_NUMBER()over(partition by col1 order by id) будет иметь другое значение для того же col1. Затем вы можете использовать это вместе с col1, чтобы сгруппировать свои данные и выполнить SUM. Что-то вроде этого

Sample Data

DECLARE @TabVar TABLE 
(
    ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT 
) 
INSERT INTO @TabVar 
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3) 

Запрос

SELECT Col1,SUM(Col2) sumcol 
FROM 
(
SELECT id - ROW_NUMBER()over(partition by col1 order by id) grpcol,Col1,Col2,id 
FROM @TabVar 
)T 
GROUP BY grpcol,Col1 
ORDER BY MAX(ID) 

Выход

Col1 sumcol 
a 5 
b 6 
a 9 
b 3 

Edit

Incase ваши ID s не последовательны в реальной среде, вы можете использовать этот

SELECT Col1,SUM(Col2) sumcol 
FROM 
(
SELECT ROW_NUMBER()over(order by id) - ROW_NUMBER()over(partition by col1 order by id) grpcol, Col1,Col2,id 
FROM @TabVar 
)T 
GROUP BY grpcol,Col1 
ORDER BY MAX(ID) 
+1

'идентичностей может не быть consecutive': проверить это http://stackoverflow.com/questions/14642013/ почему-это-там разрядники-в-моих идентичность столбца значений. в определенном случае это потерпит неудачу. например, взять эти данные и выполнить запрос: DECLARE @TabVar TABLE ( ID INT, col1 VARCHAR (20), Col2 INT ) INSERT INTO @TabVar VALUES (1, 'а', 2), (3, 'а', 3), (4, 'B', 4), (5, 'B', 2), (6, 'а', 6), (7, 'а', 3), (8, 'b', 3) –

+1

@DeepakPawar - мое решение основано на текущем образце, предоставленном OP. Здесь 'id' будет последовательным, так как не задействовано« RESEED »или транзакционный откат, которые являются основными причинами идентичности, которые не должны быть последовательными. более общим решением будет 'row_number() over (order by id)' – ughai