当前位置: 代码迷 >> SQL >> SQL Server 2008程序设计之 cte递归查询中限制递归层次,PIVOT跟UNPIVOT表旋转的应用
  详细解决方案

SQL Server 2008程序设计之 cte递归查询中限制递归层次,PIVOT跟UNPIVOT表旋转的应用

热度:22   发布时间:2016-05-05 12:52:18.0
SQL Server 2008程序设计之 cte递归查询中限制递归层次,PIVOT和UNPIVOT表旋转的应用
--SQL Server 2008程序设计之 cte递归查询中限制递归层次,PIVOT和UNPIVOT表旋转的应用      /********************************************************************************     *主题:SQL Server 2008程序设计之  *说明:本文是个人学习的一些笔记和个人愚见     *      有很多地方你可能觉得有异议,欢迎一起讨论         *作者:Stephenzhou(阿蒙)     *日期: 2012.12.3 *Mail:[email protected]     *另外:转载请著名出处。    **********************************************************************************/  


 

--精通Sql2008 程序设计

--cte查询

--如下表

--如下表/*SELECT * FROM employeetreeemployeeid  employeename                                       reportsto----------- -------------------------------------------------- -----------1           Richard                                            NULL2           Stephen                                            13           Clemens                                            24           Malek                                              25           Goksin                                             46           Kimberly                                           17           Ramesh                                             5(7 行受影响)*/


--找出Stephen下面的员工和对应的领导

 

;with ctas(select * from employeetree where employeeid=2union allselect e.* from employeetree e inner join ct c on e.reportsto=c.employeeid)select c.employeename,e.employeename from ct c join employeetree e on c.reportsto=e.employeeid/*employeename                                       employeename-------------------------------------------------- --------------------------------------------------Stephen                                            RichardClemens                                            StephenMalek                                              StephenGoksin                                             MalekRamesh                                             Goksin(5 行受影响)*/


 

--option (maxrecursion 25)

;with ctas(select * from employeetree where employeeid=2union allselect e.* from employeetree e inner join ct c on e.reportsto=c.employeeid)select c.employeename,e.employeename from ct c join employeetree e on c.reportsto=e.employeeidoption(maxrecursion 2)/*employeename                                       employeename-------------------------------------------------- --------------------------------------------------Stephen                                            RichardClemens                                            StephenMalek                                              StephenGoksin                                             Malek消息 530,级别 16,状态 1,第 1 行语句被终止。完成执行语句前已用完最大递归 2。*/


--说明:在开发中,有递归的限制,默认的限制为100 如果超过100 必须设置 option(Maxrecursion 0) 没有最大的限制
--但是一般在开发中不需要限制这个递归的层次,只需要在后面跟个where来限制需要的层次就好了

 

--PIVOT 和UNPIVOT运算符

 

 

 

create table VendorEmployee(VendorID int,Emp1orders int,Emp2Orders int,Emp3Orders int,Emp4Orders int,Emp5Orders int)goinsert into VendorEmployee values(1,4,3,5,4,4)insert into VendorEmployee values(2,4,1,5,5,5)insert into VendorEmployee values(3,4,3,5,4,4)insert into VendorEmployee values(4,4,2,5,4,4)insert into VendorEmployee values(5,5,1,5,5,5)select * from VendorEmployee /* VendorID    Emp1orders  Emp2Orders  Emp3Orders  Emp4Orders  Emp5Orders----------- ----------- ----------- ----------- ----------- -----------1           4           3           5           4           42           4           1           5           5           53           4           3           5           4           44           4           2           5           4           45           5           1           5           5           5(5 行受影响) */ 


UNPIVOT转换

 select * from (select * from VendorEmployee)punpivot(Orfder for Employee in (Emp1orders,Emp2Orders,Emp3Orders,Emp4Orders,Emp5Orders))s /*VendorID    Orfder      Employee----------- ----------- --------------------------------------------------------1           4           Emp1orders1           3           Emp2Orders1           5           Emp3Orders1           4           Emp4Orders1           4           Emp5Orders2           4           Emp1orders2           1           Emp2Orders2           5           Emp3Orders2           5           Emp4Orders2           5           Emp5Orders3           4           Emp1orders3           3           Emp2Orders3           5           Emp3Orders3           4           Emp4Orders3           4           Emp5Orders4           4           Emp1orders4           2           Emp2Orders4           5           Emp3Orders4           4           Emp4Orders4           4           Emp5Orders5           5           Emp1orders5           1           Emp2Orders5           5           Emp3Orders5           5           Emp4Orders5           5           Emp5Orders(25 行受影响)*/


--把上面的表再复制到别的表上去然后再pivot下旋转下看看
--如下

 

select * into ##aa from (  select * from (select * from VendorEmployee)punpivot(Orfder for Employee in (Emp1orders,Emp2Orders,Emp3Orders,Emp4Orders,Emp5Orders))s )f


 --执行旋转。povit

 

 

 

select * from (select * from ##aa)p pivot (sum(Orfder) for Employee in (Emp1orders,Emp2Orders,Emp3Orders,Emp4Orders,Emp5Orders))f order by vendorID/*VendorID    Emp1orders  Emp2Orders  Emp3Orders  Emp4Orders  Emp5Orders----------- ----------- ----------- ----------- ----------- -----------1           4           3           5           4           42           4           1           5           5           53           4           3           5           4           44           4           2           5           4           45           5           1           5           5           5(5 行受影响)*/-- 很简单的两个旋转来旋转去的。


 

 

 

 

 *作者:Stephenzhou(阿蒙)     
 *日期: 2012.12.3
 *Mail:[email protected]     
 *另外:转载请著名出处。
 *博客地址:http://blog.csdn.net/szstephenzhou

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  相关解决方案