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

求生成成绩报表的语句
表结构如下:其中a为姓名,b为科目,c为成绩
CREATE   TABLE   #aa(a   varchar(10),b   varchar(10),c   float)

insert   #aa
select   '小明 ', '语文 ',80   union   all
select   '小杜 ', '语文 ',82   union   all
select   '小龙 ', '语文 ',90   union   all
select   '小明 ', '数学 ',78   union   all
select   '小杜 ', '数学 ',88   union   all
select   '小龙 ', '数学 ',68   union   all
select   '小明 ', '英语 ',67   union   all
select   '小杜 ', '英语 ',85   union   all
select   '小龙 ', '英语 ',64  

select   *   from   #aa
drop   table   #aa

最后的显示结果要求为:

姓名   语文   数学   英语
-------------------
小明   80       78       67
小杜   82       88       85
小龙   90       68       64

要求不能使用游标,语句尽量精简,能一条语句实现的最好

------解决方案--------------------
CREATE TABLE #aa(a varchar(10),b varchar(10),c float)

insert #aa
select '小明 ', '语文 ',80 union all
select '小杜 ', '语文 ',82 union all
select '小龙 ', '语文 ',90 union all
select '小明 ', '数学 ',78 union all
select '小杜 ', '数学 ',88 union all
select '小龙 ', '数学 ',68 union all
select '小明 ', '英语 ',67 union all
select '小杜 ', '英语 ',85 union all
select '小龙 ', '英语 ',64

select
a 姓名,
sum(case when b= '语文 ' then c end) 语文,
sum(case when b= '数学 ' then c end) 数学,
sum(case when b= '英语 ' then c end) 英语
from #aa group by a

drop table #aa

--结果
姓名 语文 数学 英语
---------- ------------------------------ ----------
小杜 82.0 88.0 85.0
小龙 90.0 68.0 64.0
小明 80.0 78.0 67.0

(所影响的行数为 3 行)
------解决方案--------------------
select 姓名=a,语文=max(case when b= '语文 ' then c end),数学=max(case when b= '数学 ' then c end),英语=max(case when b= '英语 ' then c end) from #aa group by a

------解决方案--------------------
唉,写错了都没抢上,呵呵~
select a 姓名,
语文=max(case b when '语文 ' then c end) ,
数学=max(case b when '数学 ' then c end) ,
英语=max(case b when '英语 ' then c end)
from #aa
group by a
------解决方案--------------------
知道只有语文,数学,英语,用楼上的

如果不知道科目
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',max(case b when ' ' '+b+ ' ' ' then c end as [ '+b+ '] '
from #aa
group by b

exec( 'select a '+@sql+ ' from #aa group by a ')

------解决方案--------------------
CREATE TABLE #aa(a varchar(10),b varchar(10),c float)