求教改变数据表表现方式,有点类似行转列,但还是有点不大一样,先谢谢了
我目前遇到一个关于sql数据组织的疑问,
问题描述:我在项目开发中显有一个数据表如下:
studentId subject point classOrder gradeOrder
A 语文 90 1 2
A 数学 80 4 15
A 英语 95 2 4
B 语文 85 6 25
B 数学 98 1 2
B 英语 100 1 1
现想把以上数据表现方式改变成以下方式
studentId 语文 classOrder gradeOrder 数学 classOrder gradeOrder 英语 classOrder gradeOrder
A 90 1 2 80 4 15 95 2 15
B 85 6 25 98 1 2 100 1 1
补充说明:
1、科目是动态的,可以增减的,不是固定就这么几科
2、学生数也是动态的
希望大家踊跃发言,提供点思路,谢谢!
[解决办法]
--> 测试数据:[test]if object_id('[test]') is not null drop table [test]create table [test]([studentId] varchar(1),[subject] varchar(4),[point] int,[classOrder] int,[gradeOrder] int)insert [test]select 'A','语文',90,1,2 union allselect 'A','数学',80,4,15 union allselect 'A','英语',95,2,4 union allselect 'B','语文',85,6,25 union allselect 'B','数学',98,1,2 union allselect 'B','英语',100,1,1declare @str varchar(max)set @str=''select @str=@str+','+[subject]+'=max(case when [subject]='+QUOTENAME([subject],'''') +' then [point] else 0 end),' +'classOrder'+'=max(case when [subject]='+QUOTENAME([subject],'''') +' then [classOrder] else 0 end),' +'gradeOrder'+'=max(case when [subject]='+QUOTENAME([subject],'''') +' then [gradeOrder] else 0 end)' from test group by [subject]exec('select [studentId]'+@str+' from test group by [studentId]')/*studentId 数学 classOrder gradeOrder 英语 classOrder gradeOrder 语文 classOrder gradeOrder-------------------------------------------A 80 4 15 95 2 4 90 1 2B 98 1 2 100 1 1 85 6 25*/
[解决办法]