如果,想把类似如下数据:
姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 英语 80
李四 语文 75
李四 数学 95
......
变为
姓名 语文 数学 英语
张三 80 90 80
李四 75 95
......
其中,科目数不确定,请问如何实现?谢谢!
姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 英语 80
李四 语文 75
李四 数学 95
......
变为
姓名 语文 数学 英语
张三 80 90 80
李四 75 95
......
其中,科目数不确定,请问如何实现?谢谢!
go
insert t values('张三','语文',80)
insert t values('张三','数学',90)
insert t values('张三','英语',80)
insert t values('李四','语文',85)
insert t values('张三','数学',95)godeclare @sql varchar(1000)set @sql = ''
select @sql=@sql+',sum(case when code = '''+code +'''then cj else 0 end )as '+code
from (select distinct code from t) a
set @sql = 'select name '+@sql+' from t group by name'
--print @sql
exec (@sql)/*name 数学 英语 语文
---------- ----------- ----------- -----------
李四 0 0 85
张三 185 80 80*/
drop table t
不好意思,刚才有数据错误
create table t (name varchar(10),code varchar(10),cj int)
go
insert t values('张三','语文',80)
insert t values('张三','数学',90)
insert t values('张三','英语',80)
insert t values('李四','语文',85)
insert t values('李四','数学',95)godeclare @sql varchar(1000)set @sql = ''
select @sql=@sql+',sum(case when code = '''+code +'''then cj else 0 end )as '+code
from (select distinct code from t) a
set @sql = 'select name '+@sql+' from t group by name'
--print @sql
exec (@sql)/*name 数学 英语 语文
---------- ----------- ----------- -----------
李四 95 0 85
张三 90 80 80
*/
drop table t
insert T select '张三','语文',80
insert T select '张三','数学',90
insert T select '张三','英语',80
insert T select '李四','语文',75
insert T select '李四','数学',95 go
declare @s nvarchar(4000)
set @s=''
select
@s=@s+','+quotename(科目)+'=sum(case when [科目]='+quotename(科目,'''')+' then 成绩 else 0 end)'
from
T
group by 科目exec ('select 姓名'+@s+' from T group by 姓名')
或:
select 姓名,
[数学]=sum(case when [科目]='数学' then 成绩 else 0 end),
[英语]=sum(case when [科目]='英语' then 成绩 else 0 end),
[语文]=sum(case when [科目]='语文' then 成绩 else 0 end)
from T
group by 姓名姓名 数学 英语 语文
---------- ----------- ----------- -----------
李四 95 0 75
张三 90 80 80(所影响的行数为 2 行)