当前位置: 首页 > news >正文

SQLserver行转列与列转行

行表:

行表
姓名属性属性值
JACK身高180
JACK体重80
JACK年龄27
TOM身高164
TOM体重59
TOM年龄20

列表:

列表 
姓名身高年龄体重
JACK1802780
TOM1642059

行转列就是将行表转换为列表,反之为列转行。

--==================================================================
----------------------------行转列----------------------------------
--==================================================================
-------------------------建立测试表
if exists(select * from sysobjects where ID=OBJECT_ID(N'BodyInfo') AND XTYPE='U')
DROP TABLE BodyInfo
Create Table BodyInfo
(
 姓名      varchar(20),
 属性      VARCHAR(20),
属性值     int
)
------------------------插入测试数据
insert into BodyInfo
select 'JACK','身高',180 union all
select 'JACK','体重',80  union all
select 'JACK','年龄',27  union all
select 'TOM','身高',164 union all
select 'TOM','体重',59  union all
select 'TOM','年龄',20 

----------------------------------------方法一:使用静态SQL
select 姓名,
max(case 属性 when '身高' then 属性值 else 0 end) AS 身高,
max(case 属性 when '体重' then 属性值 else 0 end) As 体重,
max(case 属性 when '年龄' then 属性值 else 0 end) AS 年龄
from BodyInfo group by 姓名

----------------------------------------方法二:使用动态SQL
DECLARE @sql varchar(1000)
set @sql='select 姓名'
select @sql=@sql+',max(case 属性 when '''+属性+''' then 属性值 else 0 end) AS '+属性+''
from (select  distinct 属性 from BodyInfo) a
set @sql=@sql+' from BodyInfo group by 姓名'
--print @sql
exec(@sql)

----------------------------------------方法三:使用isnull
go
/*isnull的语法是:ISNULL ( check_expression , replacement_value )
 参数
check_expression

将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

replacement_value

在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。

返回类型
返回与 check_expression 相同的类型。
*/
declare @sql varchar(8000)

select @sql=isnull(@sql+',','')+'max(case 属性 when '''+属性+''' then 属性值 else 0 end) ['+属性+']'

from (select distinct 属性 from BodyInfo) b
    

set @sql='select 姓名,'+@sql+' from BodyInfo group by 姓名'
print @sql 
exec(@sql)


--------------------------------------------------方法四:使用pivot

select * from  BodyInfo pivot(max(属性值)for 属性 in(身高,体重,年龄))a

--------------------------------------------------方法五:使用stuff扩展pivot多变量赋值

go
declare @sql varchar(8000)

set @sql=''  --初始化变量@sql

select @sql=@sql+','+属性 from BodyInfo group by 属性--变量多值赋值

set @sql=stuff(@sql,1,1,'')--去掉首个','

set @sql='select * from BodyInfo pivot (max(属性值) for 属性 in ('+@sql+'))a'

exec(@sql)

------------------------------------------方法六:使用isnull扩展pivot多变量赋值

go

declare @sql varchar(8000)


select @sql=isnull(@sql+',','')+属性 from BodyInfo group by 属性           

set @sql='select * from BodyInfo pivot (max(属性值) for 属性 in ('+@sql+'))a'

exec(@sql)

--==================================================================
----------------------------列转行----------------------------------
--==================================================================
--建立测试表
if exists(select * from sysobjects where id=OBJECT_ID(N'personInfo') AND XTYPE='U')
DROP TABLE personInfo
create table personInfo
(
  姓名 varchar(20),
  身高 int,
  年龄 int,
  体重 int
)
----插入测试数据
INSERT INTO personInfo 
SELECT 'JACK',180,27,80 UNION ALL
SELECT 'TOM',164,20,59

-------------------------------------------------方法一:使用CASE...WHEN

select * from

(

 select 姓名,属性='身高',属性值=身高 from personInfo

 union all

 select 姓名,属性='体重',属性值=体重 from personInfo

 union all

 select 姓名,属性='年龄',属性值=年龄 from personInfo

) t

order by 姓名,case 属性 when '身高' then 1 when '体重' then 2 when '年龄' then 3 end


------------------------------------------------调用系统表
--调用系统表。
go
declare @sql varchar(8000)

select @sql=isnull(@sql+' union all ','')+' select 姓名, [属性]='

+quotename(Name,'''')+' , [属性值] = '+quotename(Name)+' from personInfo'

from syscolumns

where Name!='姓名'and ID=object_id('personInfo')--表名personInfo,不包含列名为姓名的其他列

order by colid

set @sql=@sql+' order by 姓名'
--print @sql
exec(@sql)


-----------------------------------------------使用UNPIVOT
SELECT  姓名 ,
        属性 ,
        属性值
FROM    personInfo UNPIVOT ( 属性值 FOR 属性 IN ( [身高], [体重], [年龄] ) ) t 

----------------------------------------------使用isnull扩展UNPIVOT
go
DECLARE @sql NVARCHAR(4000)

SELECT  @sql = ISNULL(@sql + ',', '') + QUOTENAME(name)
FROM    syscolumns
WHERE   id = OBJECT_ID('personInfo')
        AND name NOT IN ( '姓名' )
ORDER BY colid

SET @sql = 'select 姓名,[属性],[属性值] from personInfo unpivot ([属性] for [属性值] in(' + @sql
    + '))b'

EXEC(@sql)

 

相关文章:

  • d3js shape深入理解
  • 解决WordPress安装主题/插件提示输入FTP帐号的问题
  • jdk 7下载地址
  • leetcode Longest Common Prefix
  • Javascript之sort深入探究
  • Java中继承的规则
  • ExpandableListView(二级ListView)的使用
  • EventFiringWebDriver网页事件监听(一)
  • 为您的Android,iOS等应用加入声波传输功能
  • virtualbox测试k8s要注意的情况
  • 操蛋的面试题(更新)
  • 深入剖析Java中的装箱和拆箱
  • 跨平台应用——Qt VS HTML5(上)
  • Python学习之路(2017.7.15)
  • MySQL中文全文检索
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 2019年如何成为全栈工程师?
  • cookie和session
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript设计模式之工厂模式
  • mysql中InnoDB引擎中页的概念
  • PHP变量
  • Python学习之路13-记分
  • SpriteKit 技巧之添加背景图片
  • 从0到1:PostCSS 插件开发最佳实践
  • 浮动相关
  • 容器服务kubernetes弹性伸缩高级用法
  • 算法之不定期更新(一)(2018-04-12)
  • 用 Swift 编写面向协议的视图
  • 优秀架构师必须掌握的架构思维
  • ​渐进式Web应用PWA的未来
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • $refs 、$nextTic、动态组件、name的使用
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (转)大型网站架构演变和知识体系
  • ****Linux下Mysql的安装和配置
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET命名规范和开发约定
  • .NET序列化 serializable,反序列化
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • 。Net下Windows服务程序开发疑惑
  • @Valid和@NotNull字段校验使用
  • [Android View] 可绘制形状 (Shape Xml)
  • [codevs] 1029 遍历问题
  • [C语言]——内存函数
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [JavaEE系列] wait(等待) 和 notify(唤醒)
  • [Labtools 27-1429] XML parser encountered a problem in file
  • [Linux]history 显示命令执行的时间
  • [PAT练级笔记] 44 Basic Level 1044 火星数字
  • [PHP源码阅读]empty和isset函数