日期:2014-05-18  浏览次数:20537 次

MS Sql Server 按某一列求小计,但是不合并行;汇总求和;统计求和
现在有一张如下图的基础数据:

需要查出的结果是:




创建表的代码:
CREATE TABLE [student] (
[id] [int] IDENTITY (1, 1) NOT NULL,
[学生] [varchar] (50) NULL,
[科目] [varchar] (50) NULL,
[分数] [int] NULL,
[学期] [varchar] (50) NULL,
[学号] [varchar] (50) NULL)

ALTER TABLE [student] WITH NOCHECK ADD CONSTRAINT [PK_student] PRIMARY KEY NONCLUSTERED ( [id] )
SET IDENTITY_INSERT [student] ON

测试数据:
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 1,N'甲',N'语文',88,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 2,N'甲',N'英语',77,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 3,N'甲',N'数学',66,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 4,N'乙',N'语文',100,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 5,N'乙',N'英语',90,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 6,N'乙',N'数学',80,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 7,N'甲',N'语文',88,N'1',N'003')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 8,N'甲',N'英语',77,N'1',N'003')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 9,N'甲',N'数学',66,N'1',N'003')



------解决方案--------------------
SQL code

CREATE TABLE [student] (
[id] [int] IDENTITY (1, 1) NOT NULL,
[学生] [varchar] (50) NULL,
[科目] [varchar] (50) NULL,
[分数] [int] NULL,
[学期] [varchar] (50) NULL,
[学号] [varchar] (50) NULL)

ALTER TABLE [student] WITH NOCHECK ADD CONSTRAINT [PK_student] PRIMARY KEY NONCLUSTERED ( [id] )
SET IDENTITY_INSERT [student] ON


INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 1,N'甲',N'语文',88,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 2,N'甲',N'英语',77,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 3,N'甲',N'数学',66,N'1',N'001')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 4,N'乙',N'语文',100,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 5,N'乙',N'英语',90,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 6,N'乙',N'数学',80,N'1',N'002')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 7,N'甲',N'语文',88,N'1',N'003')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 8,N'甲',N'英语',77,N'1',N'003')
INSERT [student] ([id],[学生],[科目],[分数],[学期],[学号]) VALUES ( 9,N'甲',N'数学',66,N'1',N'003')

;with t
as(
select 学生,科目,分数,学期,学号,学号 as id
 from [student]
),
m as(
select 合计='合计',col2='',SUM(分数)as 分数,
col3='',col4='',学号 from [student]
group  by 学生,学号,学期,学号 
)
select 学生,科目,分数,学期,学号 from(select * from t 
union all select * from m)a order by id,学生 desc
/*
学生    科目    分数    学期    学号
甲    语文    88    1    001
甲    英语    77    1    001
甲    数学    66    1    001
合计        231        
乙    语文    100    1    002
乙    英语    90    1    002
乙    数学    80    1    002
合计        270        
甲    语文    88    1    003
甲    英语    77    1    003
甲    数学    66    1    003
合计        231        
*/


解决了