Tsql 按行的出现情况分组

Tsql 按行的出现情况分组,tsql,group-by,sql-server-2012,gaps-and-islands,Tsql,Group By,Sql Server 2012,Gaps And Islands,有一个像下面这样的表格,我必须根据group by计算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 Expe

有一个像下面这样的表格,我必须根据group by计算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

我曾尝试使用排序函数进行排序,但排序是使用Col1的累计总数的顺序来完成的。您可以使用
行数()
按分区,然后使用
按分组来实现这一点

每当链断开时,
id-ROW_NUMBER()(按col1划分,按id排序)
将为相同的
col1
值提供不同的值。然后,您可以将其与
col1
一起使用,对数据进行分组,并进行
求和
。像这样的

样本数据

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
编辑

Col1 sumcol
a   5
b   6
a   9
b   3
如果您的
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)

标识可能不是连续的
:请检查此项。在某种情况下,它会失败。例如,获取这些数据并运行查询:将@TabVar表(ID INT,col1 varchar(20),Col2 INT)插入@TabVar值(1,'a',2),(3,'a',3),(4,'b',4),(5,'b',2),(6,'a',6),(7,'a',3),(8,'b',3)@DeepakPawar-我的解决方案基于OP提供的当前样本。此处的
id
将是连续的,因为不涉及
重新设定种子
或事务回滚,这是标识不连续的主要原因。一个更通用的解决方案是在(按id排序)上加一个
row\u number()