行列互转[整理人:中国风(Roy)]

-- 行列互转
/*
*****************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂

整理人:中国风(Roy)

日期:2008.06.06
*****************************************************************************************************************************************************
*/

-- 1、行互列
--
> --> (Roy)生成測試數據

if   not   object_id ( ' Class ' is   null
    
drop   table  Class
Go
Create   table  Class( [ Student ]   nvarchar ( 2 ), [ Course ]   nvarchar ( 2 ), [ Score ]   int )
Insert  Class
select  N ' 张三 ' ,N ' 语文 ' , 78   union   all
select  N ' 张三 ' ,N ' 数学 ' , 87   union   all
select  N ' 张三 ' ,N ' 英语 ' , 82   union   all
select  N ' 张三 ' ,N ' 物理 ' , 90   union   all
select  N ' 李四 ' ,N ' 语文 ' , 65   union   all
select  N ' 李四 ' ,N ' 数学 ' , 77   union   all
select  N ' 李四 ' ,N ' 英语 ' , 65   union   all
select  N ' 李四 ' ,N ' 物理 ' , 85  
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   0   end ),
    
[ 物理 ] = max ( case   when   [ Course ] = ' 物理 '   then   [ Score ]   else   0   end ),
    
[ 英语 ] = max ( case   when   [ Course ] = ' 英语 '   then   [ Score ]   else   0   end ),
    
[ 语文 ] = max ( case   when   [ Course ] = ' 语文 '   then   [ Score ]   else   0   end
from  
    Class 
group   by   [ Student ]

GO
动态:

declare   @s   nvarchar ( 4000 )
Select       @s = isnull ( @s + ' , ' , '' ) + quotename ( [ Course ] from  Class  group   by [ Course ]
exec ( ' select * from Class pivot (max([Score]) for [Course] in( ' + @s + ' ))b ' )

生成静态:
select   *  
from  
    Class 
pivot 
    (
max ( [ Score ] for   [ Course ]   in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b

生成格式:
/*
Student 数学          物理          英语          语文
------- ----------- ----------- ----------- -----------
李四      77          85          65          65
张三      87          90          82          78

(2 行受影响)
*/

-- ----------------------------------------------------------------------------------------
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 + ' ,[总成绩]=sum([Score])  from Class group by [Student] ' ) -- 加多一列(学科平均分用avg([Score]))

生成动态:

select  
    
[ Student ] ,
    
[ 数学 ] = max ( case   when   [ Course ] = ' 数学 '   then   [ Score ]   else   0   end ),
    
[ 物理 ] = max ( case   when   [ Course ] = ' 物理 '   then   [ Score ]   else   0   end ),
    
[ 英语 ] = max ( case   when   [ Course ] = ' 英语 '   then   [ Score ]   else   0   end ),
    
[ 语文 ] = max ( case   when   [ Course ] = ' 语文 '   then   [ Score ]   else   0   end ),
    
[ 总成绩 ] = sum ( [ Score ] -- 加多一列(学科平均分用avg([Score]))
from  
    Class 
group   by   [ Student ]

go

-- 2005方法:

动态:

declare   @s   nvarchar ( 4000 )
Select       @s = isnull ( @s + ' , ' , '' ) + quotename ( [ Course ] from  Class  group   by [ Course ]   -- isnull(@s+',','') 去掉字符串@s中第一个逗号
exec ( ' select [Student], ' + @s + ' ,[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a 
pivot (max([Score]) for [Course] in(
' + @s + ' ))b  ' )

生成静态:

select  
    
[ Student ] , [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] , [ 总成绩 ]  
from  
    (
select   * , [ 总成绩 ] = sum ( [ Score ] ) over (partition  by   [ Student ] from  Class) a  -- 平均分时用avg([Score])
pivot 
    (
max ( [ Score ] for   [ Course ]   in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b 

生成格式:

/*
Student 数学          物理          英语          语文          总成绩
------- ----------- ----------- ----------- ----------- -----------
李四      77          85          65          65          292
张三      87          90          82          78          337

(2 行受影响)
*/

go

-- 2、列转行
--
> --> (Roy)生成測試數據

if   not   object_id ( ' Class ' is   null
    
drop   table  Class
Go
Create   table  Class( [ Student ]   nvarchar ( 2 ), [ 数学 ]   int , [ 物理 ]   int , [ 英语 ]   int , [ 语文 ]   int )
Insert  Class
select  N ' 李四 ' , 77 , 85 , 65 , 65   union   all
select  N ' 张三 ' , 87 , 90 , 82 , 78
Go

-- 2000:

动态:

declare   @s   nvarchar ( 4000 )
select   @s = isnull ( @s + '  union all  ' , '' ) + ' select [Student],[Course]= ' + quotename (Name, '''' ) -- isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+ ' ,[Score]= ' + quotename (Name) + '  from Class '
from  syscolumns  where  ID = object_id ( ' Class ' and  Name  not   in ( ' Student ' ) -- 排除不转换的列
order   by  Colid
exec ( ' select * from ( ' + @s + ' )t order by [Student],[Course] ' ) -- 增加一个排序

生成静态:
select   *  
from  ( select   [ Student ] , [ Course ] = ' 数学 ' , [ Score ] = [ 数学 ]   from  Class  union   all  
select   [ Student ] , [ Course ] = ' 物理 ' , [ Score ] = [ 物理 ]   from  Class  union   all  
select   [ Student ] , [ Course ] = ' 英语 ' , [ Score ] = [ 英语 ]   from  Class  union   all  
select   [ Student ] , [ Course ] = ' 语文 ' , [ Score ] = [ 语文 ]   from  Class)t 
order   by   [ Student ] , [ Course ]

go
-- 2005:

动态:

declare   @s   nvarchar ( 4000 )
select   @s = isnull ( @s + ' , ' , '' ) + quotename (Name)
from  syscolumns  where  ID = object_id ( ' Class ' and  Name  not   in ( ' Student '
order   by  Colid
exec ( ' select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in( ' + @s + ' ))b ' )

go
select  
    Student,
[ Course ] , [ Score ]  
from  
    Class 
unpivot 
    (
[ Score ]   for   [ Course ]   in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b

生成格式:
/*
Student Course Score
------- ------- -----------
李四      数学      77
李四      物理      85
李四      英语      65
李四      语文      65
张三      数学      87
张三      物理      90
张三      英语      82
张三      语文      78

(8 行受影响)
*/
基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值