求生成成绩报表的语句
表结构如下:其中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)
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
declare @sql varchar(8000)
set @sql= 'select 姓名=a, '
select @sql=@sql+quotename(b)+ '=max(case when b= '+quotename(b, ' ' ' ')+ ' then c else 0 end), '
from #aa
group by b
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from #aa group by a '
exec(@sql)
--result
姓名 数学 英语 语文
---------- ----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
小杜 88.0 85.0 82.0
小龙 68.0 64.0 90.0
小明 78.0 67.0 80.0
[解决办法]
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
DECLARE @S VARCHAR (1000)
SET @S= 'select a '
select @S= @S+ ',SUM(CASE b WHEN ' ' '+b+ ' ' ' THEN c END) AS [ '+b+ '] ' FROM (SELECT distinct b from #aa) bb
SET @S= @S+ ' from #aa group by a '
EXEC(@S)
drop TABLE #aa
--结果
a 数学 英语 语文
---------- ---------------------- ---------------------- ----------------------
小杜 88 85 82
小龙 68 64 90
小明 78 67 80
[解决办法]
select 姓名,
语文=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 姓名