博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql的行转列(PIVOT)与列转行(UNPIVOT)
阅读量:6899 次
发布时间:2019-06-27

本文共 1630 字,大约阅读时间需要 5 分钟。

hot3.png

在做数据统计的时候,行转列,列转行是经常碰到的问题。case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOTUNPIVOT比较快速实现行转列,列转行,而且可扩展性强

一、行转列

1、测试数据准备 

CREATE  TABLE [StudentScores]

(

   [UserName]         NVARCHAR(20),        --学生姓名

   [Subject]          NVARCHAR(30),        --科目

   [Score]            FLOAT,               --成绩

)

 

INSERT INTO [StudentScores] SELECT '张三', '语文', 80

INSERT INTO [StudentScores] SELECT '张三', '数学', 90

INSERT INTO [StudentScores] SELECT '张三', '英语', 70

INSERT INTO [StudentScores] SELECT '张三', '生物', 85

INSERT INTO [StudentScores] SELECT '李四', '语文', 80

INSERT INTO [StudentScores] SELECT '李四', '数学', 92

INSERT INTO [StudentScores] SELECT '李四', '英语', 76

INSERT INTO [StudentScores] SELECT '李四', '生物', 88

INSERT INTO [StudentScores] SELECT '码农', '语文', 60

INSERT INTO [StudentScores] SELECT '码农', '数学', 82

INSERT INTO [StudentScores] SELECT '码农', '英语', 96

INSERT INTO [StudentScores] SELECT '码农', '生物', 78

 

https://images2015.cnblogs.com/blog/852343/201611/852343-20161106221425580-97151040.png

2、行转列sql 

SELECT * FROM [StudentScores] /*数据源*/

AS P

PIVOT

(

    SUM(Score/*行转列后 列的值*/) FOR

    p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)

) AS

执行结果:

https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222014080-1871458724.png

二、列转行

1、测试数据准备 

CREATE TABLE ProgrectDetail

(

    ProgrectName         NVARCHAR(20), --工程名称

    OverseaSupply        INT,          --海外供应商供给数量

    NativeSupply         INT,          --国内供应商供给数量

    SouthSupply          INT,          --南方供应商供给数量

    NorthSupply          INT           --北方供应商供给数量

)

 

INSERT INTO ProgrectDetail

SELECT 'A', 100, 200, 50, 50

UNION ALL

SELECT 'B', 200, 300, 150, 150

UNION ALL

SELECT 'C', 159, 400, 20, 320

UNION ALL 

https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222159799-624712374.png

2、列转行的sql 

SELECT P.ProgrectName,P.Supplier,P.SupplyNum

FROM

(

    SELECT ProgrectName, OverseaSupply, NativeSupply,

           SouthSupply, NorthSupply

     FROM ProgrectDetail

)T

UNPIVOT

(

    SupplyNum FOR Supplier IN

    (OverseaSupply, NativeSupply, SouthSupply, NorthSupply )

) P 

执行结果:

https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222326611-330127000.png

 

转载于:https://my.oschina.net/demons99/blog/1936818

你可能感兴趣的文章
“跨库分页”的四种方案
查看>>
nginx防盗链、访问控制、PHP解析、服务器代理
查看>>
解决微信web开发工具(当前系统不是安全代理,是否信任?)
查看>>
jQuery Ajax 讲解(总结)
查看>>
高阶函数
查看>>
一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
查看>>
1.30 学习笔记——环境变量PATH、cp命令、mv命令、文档查看
查看>>
LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
查看>>
区块链100讲:区块链的跨链技术
查看>>
ganache
查看>>
WebSocket
查看>>
IP网络配置
查看>>
Eureka微服务云架构源码分析
查看>>
COMMTIMEOUTS主要用于串口超时参数设置
查看>>
基于智能家居场景的POALRDB性能体验
查看>>
JAVA核心技术学习笔记 | 备考
查看>>
IOS人脸识别开发入门教程--人脸检测篇
查看>>
VC编译连接选项详解
查看>>
ZooKeeper学习第六期--ZooKeeper管理分布式环境中的数据
查看>>
JAVA springboot微服务b2b2c电子商务系统(七)springboot开启声明式事务
查看>>