SQL UNPIVOT详解
2013-11-21 14:36
246 查看
一、UNPIVOT:
UNPIVOT与PIVOT正好相反,它把数据从列旋转到行
例:
首先将源数据显示出来,看一下:
我们先把empid为1和2的2006年数据修改为null
设置完成之后在查询源数据:如下:
下面我们进行UNPIVOT操作:
下面显示查询结果集:
二、UNPIVOT操作涉及的逻辑处理阶段
UNPIVOT涉及到以下三个逻辑阶段:
1、生成副本
2、提取元素
3、删除带有NULL的行
UNPIVOT的输入是左表表达式,第一步先为左表表达式中的行生成多个副本,要进行逆透视转换的每一列都会生成一个副本。因为这里的in子句中有三个列名称,所以要为每个来源行生成三个副本。结果得到的虚拟表将包含一个新列,用于以字符串格式保存来源列的名称。该列的名称是紧接在IN子句之前指定的名称(在这里也就是orderyear)。虚拟表部分(只显示empid为3、6、9的数据)如下:
第二步从来源列中提取出于行的当前副本说代表的逆透视转换元素相对应的值。保存该值的目标列名称是紧接在for子句之前指定的(在这个例子中是val)。这个目标列将保存虚拟表中与当前行的订单年份相对应的列值。查询的虚拟表如下:
第三部,也是最后一步将删除掉结果值列为null的行。
UNPIVOT与PIVOT正好相反,它把数据从列旋转到行
例:
首先将源数据显示出来,看一下:
我们先把empid为1和2的2006年数据修改为null
UPDATE dbo.EmpYearValues SET [2006] = NULL WHERE empid IN(1, 2);
设置完成之后在查询源数据:如下:
下面我们进行UNPIVOT操作:
SELECT empid, orderyear, val FROM dbo.EmpYearValues UNPIVOT(val FOR orderyear IN([2006],[2007],[2008])) AS U;
下面显示查询结果集:
二、UNPIVOT操作涉及的逻辑处理阶段
UNPIVOT涉及到以下三个逻辑阶段:
1、生成副本
2、提取元素
3、删除带有NULL的行
UNPIVOT的输入是左表表达式,第一步先为左表表达式中的行生成多个副本,要进行逆透视转换的每一列都会生成一个副本。因为这里的in子句中有三个列名称,所以要为每个来源行生成三个副本。结果得到的虚拟表将包含一个新列,用于以字符串格式保存来源列的名称。该列的名称是紧接在IN子句之前指定的名称(在这里也就是orderyear)。虚拟表部分(只显示empid为3、6、9的数据)如下:
第二步从来源列中提取出于行的当前副本说代表的逆透视转换元素相对应的值。保存该值的目标列名称是紧接在for子句之前指定的(在这个例子中是val)。这个目标列将保存虚拟表中与当前行的订单年份相对应的列值。查询的虚拟表如下:
第三部,也是最后一步将删除掉结果值列为null的行。
相关文章推荐
- 谈谈MySql数据库锁
- 数据库质疑修复总结(转)
- sql基础查询(一)
- HTML5 Storage Wars - localStorage vs. IndexedDB vs. Web SQL
- ORACLE临时表空间
- 百万级数据库优化方案[转载]
- Redis学习笔记~目录
- ibatis动态传入表名造成的SQL注入的解决方案(摘录的)
- Can't connect to MySQL server on
- SQL中字符串截取、连接、替换等函数的用法
- ORACLE分页SQL语句
- mysql的用户管理(二)
- 琐碎--选择文件夹(路径)+生产txt格式的log+数据库操作方式
- oracle 的trim ,ltrim, rtrim
- SSH MySql乱码解决方案
- SQL MIXTURE
- mysql 性能分析及explain用法
- orcale 数据库查询同义词,视图,触发器,索引对应的基表
- 查看Oracle数据库状态
- MySQL 数据类型 详解