日期:2014-05-17  浏览次数:20478 次

这样来分组汇总,行不行呢?
姓名       学科         分数
张三         语文         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

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