当前位置: 代码迷 >> Sql Server >> 请帮看一下这个统计语句如何写
  详细解决方案

请帮看一下这个统计语句如何写

热度:5   发布时间:2016-04-24 09:28:35.0
请帮看一下这个统计语句怎么写啊
表table1
name   class     score
张三        语文     90
张三        数学    80
李四       语文      70

我想形成这样的记录集:
姓名     课程                      分数
张三     语文、数学         170   (就是90+80来的)
李四      语文                     70


不知该怎么写啊?请大家帮我


------解决思路----------------------
SELECT name
,STUFF((SELECT '、'+class FROM table1 WHERE name=T.name FOR XML PATH('')),1,1,'')
,SUM(T.score)score
FROM table1 T GROUP BY name

------解决思路----------------------
IF OBJECT_ID('F_Str') IS NOT NULL 
    DROP FUNCTION F_Str
go
CREATE FUNCTION F_Str ( @name VARCHAR(50) )
RETURNS NVARCHAR(100)
AS 
    BEGIN
        DECLARE @S NVARCHAR(100)
        SELECT  @S = ISNULL(@S + N'、', '') + class
        FROM    Table1
        WHERE   name = @name
        RETURN @S
    END
go
SELECT  name
       ,class = dbo.F_Str(name)
       ,SUM(score) AS score
FROM    Table1
GROUP BY name


参数合并分拆方法:
合并分拆表_整理贴1 

------解决思路----------------------

select name as  姓名,
stuff((select  '、'+class from table1 where name=a.name for xml path('')),1,1,'') as 课程,
sum(a.score) as 分数
from table1 as a 
group by name
order by name

------解决思路----------------------
会不成功,ACCESS可以考虑用自定义函数实现
------解决思路----------------------
首先自定义一个class的计算的标量函数


CREATE FUNCTION [dbo].[FindName]
(
@name varchar(50)
)
RETURNS varchar(max)
AS

BEGIN
-- Declare the return variable here
declare @val varchar(max)=''
select @val+= class+'、' from table1 where name=@name
set @val=left(@val,len(@val)-1)
return @val
END


然后再查询

select name '姓名',dbo.FindName(name) '课程',sum(score) '分数' from table1 group by name
  相关解决方案