微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver 行列互转

--行列互转
/******************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂
 
整理人:中国风(Roy)
 
日期:2008.06.06
******************************************************************************************************************************************************/
 
--1、行互列
--> --> (Roy)生成測試數據
  
if  not  object_id( 'Class' is  null
     drop  table  Class
Go
Create  Class([Student] nvarchar(2),[Course] nvarchar(2),[score int )
Insert  Class
select  N '张三' ,N '语文' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,78  union  all
'数学' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,87  all
'英语' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,82  all
'物理' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,90  all
'李四' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,65  all
all
all
Go
--2000方法:
动态:
 
declare  @s nvarchar(4000)
set  @s= ''
Select     @s=@s+ ',' +quotename([Course])+ '=max(case when [Course]=' +quotename([Course], '' '' )+ ' then [score] else 0 end)'
from  Class  group  by [Course]
exec ( 'select [Student]' +@s+ ' from Class group by [Student]' )
 
 
 
select 
     [Student],
[数学]= max ( case  when  [Course]= '数学'  then  [score else  end ),
[物理]= '物理'  sql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
[英语]= '英语'  sql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
[语文]= '语文' 
from 
Class 
by  [Student]
 
GO
动态:
 
@s nvarchar(4000)
@s= isnull (@s+ )+quotename([Course])  [Course]
'select * from Class pivot (max([score]) for [Course] in(' '))b' )
 
from 
Class 
pivot 
( ([score])  for  [Course]  in ([数学],[物理],[英语],[语文]))b
 
生成格式:
/*
Student 数学          物理          英语          语文
------- ----------- ----------- ----------- -----------
李四      77          85          65          65
张三      87          90          82          78
 
(2 行受影响)
*/
 
------------------------------------------------------------------------------------------
go
--加上总成绩(学科平均分)
 
--2000方法:
动态:
 
@s nvarchar(4000)
''
' then [score] else 0 end)'
[Course]
score])  from Class group by [Student]' ) --加多一列(学科平均分用avg([score]))
 
生成动态:
 
select 
[总成绩]= sum ([score])  --加多一列(学科平均分用avg([score]))
from 
Class 
[Student]
 
go
 
--2005方法:
 
动态:
 
@s nvarchar(4000)
[Course]  --isnull(@s+',','') 去掉字符串@s中第一个逗号
'select [Student],[总成绩] from (select *,[总成绩]=sum([score])over(partition by [Student]) from Class) a 
pivot (max([score]) for [Course] in(' '))b ' )
 
 
select 
from 
*,[总成绩]= ([score])over(partition  [Student])  Class) a  --平均分时用avg([score])
pivot 
 
生成格式:
 
/*
Student 数学          物理          英语          语文          总成绩
------- ----------- ----------- ----------- ----------- -----------
李四      77          85          65          65          292
张三      87          90          82          78          337
 
(2 行受影响)
*/
 
go
 
--2、列转行
--> --> (Roy)生成測試數據
  
null
Class
Go
sql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[物理]  sql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[英语]  sql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[语文]  )
Class
all
Go
 
--2000:
 
动态:
 
@s nvarchar(4000)
@s= ' union all ' sql plain" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[Course]=' +quotename( Name --isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+ sql string" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[score]=' ' from Class'
syscolumns  where  ID=object_id( and  Name  not  'Student' --排除不转换的列
order  Colid
'select * from (' ')t order by [Student],[Course]' --增加一个排序
 
sql string" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[score]=[数学]  all 
score]=[物理]  all 
score]=[英语]  all 
score]=[语文]  Class)t 
 
go
--2005:
 
动态:
 
@s nvarchar(4000)
)+quotename( )
Colid
'select Student,[Course],[score] from Class unpivot ([score] for [Course] in(' )
 
go
select 
Student,[score
from 
Class 
unpivot 
([scoresql keyword" style="list-style:none; margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,[语文]))b
 
生成格式:
/*
Student Course score
------- ------- -----------
李四      数学      77
李四      物理      85
李四      英语      65
李四      语文      65
张三      数学      87
张三      物理      90
张三      英语      82
张三      语文      78
 
(8 行受影响)
*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐