/*
productid Name Age Email Mobile
----------- ----------------------- -----------
1 long 88 test@gmail.com 13000000000
2 lz
pivot执行步骤:将行转列,分组确定行数,添加in后面的列,列值是应用聚和函数后的值
1. 隐式分组(对左输入中的所有列除FieldValue,FieldID分组,得到所有行)
2. 隔离值(为IN子句中的每个列使用case when FieldID=<目标列> then FieldValue end)
3. 应用聚和函数(为2中的case子句应用聚和函数,此处为min)
*/
select productid,min([1]) [Name],min([2]) Age,min([3]) Email,min([4]) Mobile
from prodfieldvalue
pivot (min(fieldvalue) for FieldID in([1],[2],[3],[4])) as d
group by productid
/*
结果:
productid FieldValue FiledID
----------- ------------------- ----------
1 long 1
1 88 2
1 test@gmail.com.com 3
1 1300000000 4
2 lz 1
unpivot:执行步骤:将列转行,复制unpivot左输入中的行,左输入每一行复制IN中值的数量的行数,
添加新列,列名为for后面的值,按in中值的顺序为此列的每一行赋值,过滤掉新列值为Null的行。
1. 生成副本
2. 隔离目标列值
3. 过滤掉带有NULL值的行
*/
select * from (
select productid,min([1]) [1],min([2]) [2],min([3]) [3],min([4]) [4]
from prodfieldvalue
pivot (min(fieldvalue) for FieldID in([1],[2],[3],[4])) as d
group by productid ) t
unpivot (FieldValue for FiledID in ([1],[2],[3],[4])) as tt