WEB开发网
开发学院数据库MSSQL Server SQL之行列互变问题 阅读

SQL之行列互变问题

 2008-11-21 10:11:03 来源:WEB开发网   
核心提示: 目标:要将上表“旋转”成如下传统形式:Employee_Id Zmonth A B C D E K100012008062 2 2 2 2 0.25100022008061.25 2 2 2 null110017200806nullnull0 0 0 0方法: Se

目标:要将上表“旋转”成如下传统形式:

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中去。当然,你可以使用派生表以达到你想要的效果。

Tags:SQL 行列 问题

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接