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

帮忙解决这个sql问题
已知一个表的结构为:  
姓名   科目   成绩  
张三   语文   20  
张三   数学   30  
张三   英语   50  
李四   语文   70  
李四   数学   60  
李四   英语   90  
怎样通过select语句把他变成以下结构:  
姓名   语文   数学   英语  
张三   20   30   50  
李四   70   60   90


设表名为   student  



------解决方案--------------------

declare @s varchar(1000)
set @s= ' '
select @s=@s+ ', '+quotename(科目)+ '=sum(case 科目 when '+quotename(科目, ' ' ' ')+ ' then 成绩 else 0 end) '
from 表名
group by 科目
exec( ' select 姓名 '+@s+ ' from 表名 group by 姓名 ')
------解决方案--------------------
drop table 表
go
create table 表(姓名 varchar(10),科目 varchar(10),成绩 int)
insert into 表
select '张三 ', '语文 ',20
union all select '张三 ', '数学 ',30
union all select '张三 ', '英语 ',50
union all select '李四 ', '语文 ',70
union all select '李四 ', '数学 ',60
union all select '李四 ', '英语 ',90
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',sum(case when 科目= ' ' '+科目+ ' ' ' then 成绩 else 0 end) as ' ' '+科目+ ' ' ' '
from (select distinct 科目 from 表)t
exec( 'select 姓名 '+@sql+ ' from 表 group by 姓名 ')
/*
姓名 数学 英语 语文
---------- ----------- ----------- -----------
李四 60 90 70
张三 30 50 20
*/
------解决方案--------------------
这么写的话 我试了一下 只能显示一行张三的纪录 另:问一下关于这个A B C是什么意思 谢谢
--------
這裡的A B C是表的別名
------解决方案--------------------
我借用以前别人写过
CREATE TABLE [dbo].[t] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [nvarchar] (50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
[object] [nvarchar] (50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
[score] [int] NULL ,
[user_indentity] [int] NULL
) ON [PRIMARY]

DECLARE @sql VARCHAR(800)
SET @sql = 'SELECT name '
SELECT @sql=@sql+ ',[ '+object+ ']=MAX(CASE object WHEN ' ' '+object+ ' ' ' THEN score ELSE 0 END) ' FROM t GROUP BY object
EXEC (@sql + ' FROM t GROUP BY name ')

测试通过了的