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

一、行转列

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

2、行转列sql

SELECT * FROM [StudentScores] /*数据源*/
AS P
PIVOT
(SUM(Score/*行转列后 列的值*/) FOR p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
) AS T

执行结果:

二、列转行

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

2、列转行的sql

SELECT P.ProgrectName,P.Supplier,P.SupplyNum
FROM
(SELECT ProgrectName, OverseaSupply, NativeSupply,SouthSupply, NorthSupplyFROM ProgrectDetail
)T
UNPIVOT
(SupplyNum FOR Supplier IN(OverseaSupply, NativeSupply, SouthSupply, NorthSupply )
) P

执行结果:

以上转载于:https://www.cnblogs.com/linJie1930906722/p/6036714.html。

亲测有效,超级棒,以下是我的练习

3、数据库为SQLServer

源数据为:

列传行:

sql的行转列(PIVOT)与列转行(UNPIVOT)相关推荐

  1. oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  2. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现 [sql] view plaincopy print? select concat(id,username) str from app_u ...

  3. unpivot用法 oracle10g,Oracle 行转列pivot 、列转行unpivot 的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 1 select concat(id,username) str from app_user 2 3 select id||usernam ...

  4. mysql unpivot_SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

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

  5. mysql 列转行 unpivot_sql的行转列(PIVOT)与列转行(UNPIVOT)

    一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30) ...

  6. 做图表统计你需要掌握SQL Server 行转列和列转行

    原文:做图表统计你需要掌握SQL Server 行转列和列转行 说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需 ...

  7. oracle 行转列sql语句,行转列(sql行转列)

    sql语句行转列?怎么转啊 select MIN(id) as ID, name, sex, sum(case when num=2 then 2 end) as num2, sum(case whe ...

  8. 多列转多行sql oracle,sql多行转多列,中文没办法聚集的有关问题

    sql多行转多列,中文没办法聚集的问题? 我要将下表 选项      答案       姓名 爱好      篮球       bruce 年龄      28        bruce 性别     ...

  9. SQL Server 行转列

    SQL Server 行转列 继上次的列转行需求之后,最近又遇到一个行转列的需求.因为表设计的时候考虑到可能存在多类型的数据,但是其实最后使用只有固定的几种,所以前端界面也都是固定的.所以这个时候改表 ...

最新文章

  1. 2020-09-21C++学习笔记之与C语言区别和加强——四种const意义(const int a; int const b; const int *c; int * const d)
  2. Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
  3. Amazon Corretto技术细节探秘
  4. (转载)聊聊Git原理
  5. chrome插件下载
  6. 浏览器输入 URL 之后的链路
  7. Kindle:自动追更之云上之旅
  8. 中国锂电池行业发展机遇及营销策略前景研究报告2021-2027年版
  9. HTML 遮罩显示工具栏
  10. XILINX FPGA电源设计指南
  11. sso单点登录系统(精华篇)
  12. 【TCP/IP 四 IP 网际协议】
  13. 单独使用mybatis整合mysql案例
  14. BeetlSQL 注解
  15. android:ems 属性
  16. VMware下如何虚拟软盘启动
  17. VIF,共线相关性理解
  18. 秦曾昌人工智能课程---5、KNN和朴素贝叶斯
  19. matlab开方分布上分位点,概率密度分布函数和上分位点的数值计算
  20. mooc上python课程哪个好_如何爬取中国大学MOOC上的课程信息

热门文章

  1. Clonezilla--系统克隆
  2. python pdfminer用法演示
  3. 【原创】JS+COOKIES实现健壮的购物车!
  4. Matlab中abs函数的使用
  5. 不同地域的内容偏好性分析
  6. 百度短网址开始收费了,这是真的吗?
  7. c语言编写整数划分程序,整数划分的问题
  8. YOLOV5安装步骤(一)
  9. VR虚拟现实的工作原理,你知道多少?【转】
  10. fck编辑器下载及配置使用说明