mysql+pivot+列转行_SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

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

一、行转列

1、测试数据准备

8e6447899753c0129cf8ad92969d3d7a.gif

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

97d86ce29929cb4642514c30ce2a8aa3.gif

c50edba716178431650bda053de1e401.png

2、行转列sql

cc48babe15a0e4fac0b1b0c4d275994d.gif

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

AS P

PIVOT

(

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

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

) AS T

22fdd644d55dac5700c1992b8a8436fd.gif

执行结果:

4a882d6c8ea97b89a1a20ad2d681f7e8.png

二、列转行

1、测试数据准备

ecf9b6d948b87f1cbdb188c270bffec0.gif

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

ac16393e2c333d919e9aabad484069ca.gif

fbaf806321d3920ee85cbe2da7f6e053.png

2、列转行的sql

1457a6c54166b3166ebd304227b63afa.gif

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

49b07242f392241adf096a3275d38eda.gif

执行结果:

7914409da021b885cf176c7f0ff85029.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值