首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

这么来分组汇总,行不行呢

2013-01-04 
这样来分组汇总,行不行呢?姓名学科分数张三语文90张三数学80张三英语70怎样查询出:姓名学科总分数张三语文

这样来分组汇总,行不行呢?
姓名      学科        分数
张三        语文        90
张三        数学        80
张三        英语        70

怎样查询出:
姓名        学科                            总分数
张三         语文,数学,英语          140

呵呵
[解决办法]
 declare @table table (姓名 varchar(20),学科  varchar(20),分数 int)
 insert into @table values (' 张三','语文',90),(' 张三','数学',80),(' 张三','英语',70) 
 
SELECT 姓名,SUM(分数) as 分数,学科 FROM(   
SELECT 姓名,分数,(SELECT 学科+',' FROM @table WHERE 姓名=A.姓名 for XML PATH('')) AS 学科   
FROM @table A     
) B  group by 姓名,B.学科

姓名                   分数          学科
-------------------- ----------- ----------------------------------------------------------------------------------------------------------------
 张三                  240         语文,数学,英语,
[解决办法]
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
GO
create table [tb]([姓名] varchar(4),[学科] varchar(4),[分数] int)
insert [tb]
select '张三','语文',90 union all
select '张三','数学',80 union all
select '张三','英语',70

select 姓名,b.[学科], 总分数=sum([分数]) from [tb] t
CROSS APPLY (SELECT [学科]=STUFF((SELECT ','+[学科] FROM TB WHERE t.姓名=姓名 for xml path('')),1,1,'') )b
GROUP BY 姓名,b.[学科]

drop table [tb]




[解决办法]


--student
if object_id('student','u') is not null
drop table student

go
create table student
(
姓名 nvarchar(20),
学科 nvarchar(10),
分数 smallint
)

go
insert into student values
('张三','语文',90),
('张三','数学',80),
('张三','英语',70),
('李四','语文',30),
('李四','英语',70)
 
go 
--SQL
select B.姓名,LEFT(B.BList,LEN(B.BList)-1) as 学科,B.总分 from(
select 姓名,(
select 学科+',' From Student 
where 姓名= A.姓名 
for xml path('')) BList,
SUM(分数) as 总分
from student A
group by 姓名) B

--结果集
/*
  姓名    学科               总分


--李四语文,英语       100
--张三语文,数学,英语  240
*/

热点排行