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

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

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

一、行转列

1、测试数据准备

CREATE  TABLE [StudentScores](   [UserName]         NVARCHAR(20),        --学生姓名   [Subject]          NVARCHAR(30),        --科目   [Score]            FLOAT,               --成绩)INSERT INTO [StudentScores] SELECT '张三', '语文', 80INSERT INTO [StudentScores] SELECT '张三', '数学', 90INSERT INTO [StudentScores] SELECT '张三', '英语', 70INSERT INTO [StudentScores] SELECT '张三', '生物', 85INSERT INTO [StudentScores] SELECT '李四', '语文', 80INSERT INTO [StudentScores] SELECT '李四', '数学', 92INSERT INTO [StudentScores] SELECT '李四', '英语', 76INSERT INTO [StudentScores] SELECT '李四', '生物', 88INSERT INTO [StudentScores] SELECT '码农', '语文', 60INSERT INTO [StudentScores] SELECT '码农', '数学', 82INSERT INTO [StudentScores] SELECT '码农', '英语', 96INSERT INTO [StudentScores] SELECT '码农', '生物', 78

2、行转列sql

SELECT * FROM [StudentScores] /*数据源*/AS PPIVOT (    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 ProgrectDetailSELECT 'A', 100, 200, 50, 50UNION ALLSELECT 'B', 200, 300, 150, 150UNION ALLSELECT 'C', 159, 400, 20, 320UNION ALL

2、列转行的sql

SELECT P.ProgrectName,P.Supplier,P.SupplyNumFROM (    SELECT ProgrectName, OverseaSupply, NativeSupply,           SouthSupply, NorthSupply     FROM ProgrectDetail)TUNPIVOT (    SupplyNum FOR Supplier IN    (OverseaSupply, NativeSupply, SouthSupply, NorthSupply )) P

执行结果:

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

你可能感兴趣的文章
SSH中调用另一action的方法(chain,redirect)
查看>>
数据库基础
查看>>
表格排序
查看>>
关于Android四大组件的学习总结
查看>>
java只能的round,ceil,floor方法的使用
查看>>
由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件...
查看>>
新开的博客,为自己祝贺一下
查看>>
puppet任务计划
查看>>
【CQOI2011】放棋子
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Online Patching--EBS R12.2最大的改进
查看>>
Binary Search Tree Iterator leetcode
查看>>
Oracle性能优化--DBMS_PROFILER
查看>>
uva-317-找规律
查看>>
Event事件的兼容性(转)
查看>>
我的2014-相对奢侈的生活
查看>>