SQL之行列互变问题
2008-11-21 10:11:03 来源:WEB开发网目标:要将上表“旋转”成如下传统形式:
Employee_Id Zmonth A B C D E K
10001 200806 2 2 2 2 2 0.25
10002 200806 1.25 2 2 2 null1
10017 200806 nullnull0 0 0 0
方法:
Select Employee_Id,Zmonth,
Max (Case When Performance_Cd=’A’ Then Zvalue) As A,
Max (Case When Performance_Cd=’B’ Then Zvalue) As B,
Max (Case When Performance_Cd=’C’ Then Zvalue) As C,
Max (Case When Performance_Cd=’D’ Then Zvalue) As D,
Max (Case When Performance_Cd=’E’ Then Zvalue) As E,
Max (Case When Performance_Cd=’F’ Then Zvalue) As F
From Performance_Zmonth_Value
Group by Employee_Id,Zmonth
代码简单,逻辑简单,代码性能十分高效。如果你仍然觉得代码略显复杂,在SQL2005中有更简单的解决方案。但这个简单,只是代码上的简单,经过查看两种写法的SQL执行计划,发现两种代码一模一样,性能上没有任何区别。
SELECT Employee_Id,Zmonth,A,B,C,D,E,F,K
FROM Performance_Zmonth_Value
PIVOT ( MAX(ZVALUE) FOR Performance_Cd
IN (A,B,C,D,E,F,K)
)AS P;
个人感觉,上面的代码不太好理解,因为没有明确的Group By ,所以,如果基表中有不在Select 列表中出现的列,语句在执行时会自动把这些列加到Group By中去。当然,你可以使用派生表以达到你想要的效果。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接