日期:2014-05-16  浏览次数:20475 次

求个SQL
本帖最后由 duwei1990 于 2014-03-15 10:45:05 编辑
表中记录:
GroupName NO Score
GroupA 1 50
GroupA 2 100
GroupA 9 150
GroupA 3 200
GroupA 4 150
GroupA 8 300
GroupA 12 200
GroupB 13 300
GroupB 1 300
运行结果:
GroupName Start End SUM(Score)
GroupA 1 4 500
GroupA 8 9 450
GroupA 12 12 200
GroupB 1 1 300
GroupB 13 13 300
创建表结构:
CREATE TABLE [dbo].[Test](
[GroupName] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[NO] [int] NULL,
[Score] [int] NULL
) ON [PRIMARY]
准备数据:
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',1,50)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',2,100)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',9,150)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',3,200)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',4,150)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',8,300)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',12,200)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',13,300)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',1,300)
------解决方案--------------------
引用:
Quote: 引用:

如果是2005,可以试试这个:

--drop table Test
--go

CREATE TABLE [dbo].[Test](
[GroupName] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[NO] [int] NULL,
[Score] [int] NULL
) ON [PRIMARY]

INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',1,50)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',2,100)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',9,150)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',3,200)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',4,150)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',8,300)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',12,200)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',13,300)
INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',1,300)
go

select GroupName,
       MIN(no) [start],
       MAX(NO) [end],
       SUM([Score]) score
from 
(
select *,
       ROW_NUMBER() over(partition by groupname order by no) rownum
from test
)t
group by groupname,NO-rownum
order by GroupName
/*
GroupName start end score
GroupA 1 4 500
GroupA 8 9 450
GroupA 12 12 200
GroupB 1 1 300
GroupB 13 13 300
*/
能解释下么?看不懂


其实这个代码最关键的就是求groupname相同的时候的,no的连续范围,

之所以在group by groupname,NO-rownum 这里的rownum是按照groupname分组,然后按照no排序,形成一个序号:1,2,3,4,5,6,7
这里的groupA一共有7条记录,所以上面是1-7,然