急,急,急!!!SQL的行列转换问题
/* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 74 84 94 张三 74 83 93 ------------------- */
一部分是类似的,现在我的课程的数量很多,不知道有多少,名称也是未知了,
想变成(得到如下结果):
姓名 课程1 课程2 课程3。。。。。。。。课程n ---- ---- ---- ----
李四 74 84 94
张三 74 83 93 -------------------
没有多少时间能写明白,希望能大家能理解
------解决方案--------------------里面不是有动态的吗
------解决方案--------------------你把动态字符串全部print出来,就是那个变量@sql,然后看下执行下就知道了,一般的动态就是拼case when语句,其外部有聚合函数,例如count max min sum等,05及以上版本可以用pivot等其他方法。
------解决方案--------------------http://blog.csdn.net/xys_777/article/details/5685953
去看看这个。
------解决方案--------------------用动态sql
SQL code
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)