X龙@China .Net 'blog

需要的不仅仅是工作,而是通过努力得来的美好将来。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

pivot与unpivot用法

Posted on 2012-04-17 21:51  X龙  阅读(490)  评论(0编辑  收藏  举报
/*
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
 
点击这里给我发消息http://wp.qq.com/index.html