一、UNPIVOT:
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的行。