unpivot包含3步:1.生成拷贝 2.提取数据 3.过滤不相关的数据
第一步,把每行数据都打散开来,用CROSS JOIN实现
{(1,A),(1,B),(1,C),(1,D)}
{(2,A),(2,B),(2,C),(2,D)}
....................
2008语法
SELECT *FROM dbo.EmpCustOrders  CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid);
原本的语法
SELECT *FROM dbo.EmpCustOrders  CROSS JOIN (SELECT 'A' AS custid              UNION ALL SELECT 'B'              UNION ALL SELECT 'C'              UNION ALL SELECT 'D') AS Custs;
empid       A           B           C           D----------- ----------- ----------- ----------- -----------1           NULL        20          34          NULL2           52          27          NULL        NULL3           20          NULL        22          30
empid       A           B           C           D           custid----------- ----------- ----------- ----------- ----------- ------1           NULL        20          34          NULL        A1           NULL        20          34          NULL        B1           NULL        20          34          NULL        C1           NULL        20          34          NULL        D2           52          27          NULL        NULL        A2           52          27          NULL        NULL        B2           52          27          NULL        NULL        C2           52          27          NULL        NULL        D3           20          NULL        22          30          A3           20          NULL        22          30          B3           20          NULL        22          30          C3           20          NULL        22          30          D
第二步:提取数据
第一步中的表只是为了方便展示第二部的CASE用的
SELECT empid, custid,  CASE custid    WHEN 'A' THEN A    WHEN 'B' THEN B    WHEN 'C' THEN C    WHEN 'D' THEN D  END AS qtyFROM dbo.EmpCustOrders  CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid);
empid       custid    qty----------- --------- -----------1           A         NULL1           B         201           C         341           D         NULL2           A         522           B         272           C         NULL2           D         NULL3           A         203           B         NULL3           C         223           D         30
第三步,用IS NOT NULL来清除NULL行
SELECT *FROM (SELECT empid, custid,        CASE custid          WHEN 'A' THEN A          WHEN 'B' THEN B          WHEN 'C' THEN C          WHEN 'D' THEN D        END AS qty      FROM dbo.EmpCustOrders        CROSS JOIN (VALUES('A'),('B'),('C'),('D')) AS Custs(custid)) AS DWHERE qty IS NOT NULL;
注意PIVOT 和UNPIVOT不是逆反的过程,因为已经聚合过了。
比如说(1   C  34)这行,其中的34就是由元数据表中的
1, 'C', 20
1, 'C', 14
聚合而成。

转载于:https://www.cnblogs.com/lwzz/archive/2011/01/29/1947567.html

UNPIVOT的详细说明相关推荐

  1. mysql 列转行 unpivot_T-Sql语法:行转列(pivot)和列转行(unpivot)

    在不知道PIVOT关系运算符的用法之前,我们通过聚合函数配合CASE--WHEN的写法来实现相应的功能,微软在Sql Server 2005以及更高版本中提供能PIVOT关系运算符,POVIT提供的语 ...

  2. python数据逆透视_PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...

  3. SQL Server 2005之PIVOT/UNPIVOT行列转换

    SQL Server 2005之PIVOT/UNPIVOT行列转换 作者: NinGoo(http://ningoo.itpub.net) 发表于: 2007.04.18 11:49 分类: SQL ...

  4. SQL Server 2005之PIVOT/UNPIVOT行列转换(转)

    SQL Server2005引入了很多迎合开发者口味的新特性,虽然改动不大,却大大了减少了开发者的工作量,这种替用户考虑的开发思路,值得称赞. 在SQL Server2000中,要实现行列转换,需要综 ...

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

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

  6. SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序

    https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...

  7. 经常用到的透视函数(行转列列转行)函数 PIVOT()UNPIVOT

    说明: 工作中经常遇到一组or一条数据按照不同类型被分成多条数据,如 一条合同的分期还款账单按照不同类型被分成本金,利息,管理费等, 数据统计工作中,一条合同一期就会分成多条合同 如 实际工作中 常需 ...

  8. unpivot行转列 oracle,Oracle列转行_unpivot

    Oracle列转行_unpivot 在实际业务开发环境中,我们经常会遇到要对查询的数据集进行列转行的需求.那么Oracle是如何实现的呢?本文也将通过几个实例来详细讲解一下. Oracle列转行 Or ...

  9. Pivot 和 Unpivot

    Pivot 和 Unpivot 使用简单的 SQL 以电子表格类型的交叉表报表显示任何关系表中的信息,并将交叉表中的所有数据存储到关系表中. Pivot 如您所知,关系表是表格化的,即,它们以列-值对 ...

最新文章

  1. sql 递归查询所有的下级
  2. Cube 技术解读 | 详解「支付宝」全新的卡片技术栈
  3. c语言创建学生成绩表,C语言创建信息链表,求助
  4. [商业]文件文件夹对比合并工具Araxis Merge
  5. Ms sqlserver闪退----“转载的知识”
  6. 双层循环嵌套打印矩形 java
  7. EL 11个内置对象
  8. instanceof java_Java中的instanceof关键字
  9. php 加密解密算法
  10. Unity - Windows获取屏幕分辨率、可用区域
  11. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a
  12. 绘制专利说明书附图的基本要素
  13. 免费收录网站搜索引擎登录口大全
  14. html的实习报告,HTML实习报告
  15. iOS从零开始学习socket编程——HTTP1.0服务器端
  16. 输入某年某月某日,判断这一天是星期几
  17. x-editable
  18. 将fer2013转成图片,删选图片后生成新数据集(图像转换成像素值以csv存储)
  19. 2016..8.25 切题总结
  20. 移动办公领域需求分析

热门文章

  1. python路径找类并获取静态字段
  2. sublime 安装 插件 package control,安装docblockr
  3. React Native登录注册页面实现空白处收起键盘
  4. 为什么使用hibernate
  5. 总结一下F#中运算符的定义规则
  6. HP 520 双系统 vista xp
  7. python dataframe去掉索引_关于python:删除具有重复索引的行(Pandas DataFrame和TimeSeries)...
  8. 构造一个完美的分类系统
  9. 用神经网络分类里和外
  10. iis php5.3 mysql_Win2008 R2配置IIS7.5+PHP Manager+PHP5.3+Mysql5.5+Wincache