Pivot 与 Unpivot 的 个人见解 - SQL

PIVOT : 将列的值,旋转为列,然后重新填充数据
执行下面语句新建数据库:

CREATE DATABASE Test
Create Table Salary
(
HrName varchar(50),
Monthly varchar(50),
Money money
)
insert into Salary(HrName,Monthly,[Money]) 
select '张三','一月','3000' 
union all
select '张三','二月','3200' 
union all
select '张三','三月','3500' 
union all
select '李四','一月','3800' 
union all
select '李四','二月','4200' 
union all
select '李四','三月','3900'
union all
select '张三','一月','2000'

然后我们把这放到一边先了解一下什么是将列的值,旋转为列

表1:
列  列a      列b     列c

值  列1        1         12

值  列2        2         22

值  列3        3         32

我们把列a的值旋转为列

列  列1      列2     列3

这样我们得到数据类型一样的三列,那么值应该怎么填呢?我们把表1中列1那一行的其它值看为它的值,那么列1的值可以也只能从列b或列c取,我们这里从列b取,当然,如果列b的数据类型和列a不一样的话那么就要转换.其它列同样取值,那么旋转后的表为:

表2:
列  列1      列2     列3

值  1          2         3

不理解没关系,我们下面还有示例:

我们前面新建的表为:

然后通过执行语句:

select * from dbo.Salary
pivot (sum([Money]) for Monthly in (一月,二月,三月)) as b

解释:

执行顺序是:先对整个表Salary进行旋转,再根据要输出的列输出到结果

select  * from dbo.Salary   //由于旋转后,没有列Monthly,Money,所以如果输出

sum([Money])                                                //这里必须用聚合函数,而不能用格式转换的(因为有多个值可取),money就是被取值的列 这些值是给 列 monthy 所以用for,这里注意一下,列的行数是先确定的(去掉其它列的重复行,例如上表,就是去掉hrhome列的重复行后得到两行),然后根据被取值那一行的值来确定被取值的位置,位置相同的就聚合一下

Monthly in (一月,二月,三月)                         //monthly就是要旋转的列,for给的应该是整个Monthly in (一月,二月,三月),这里in指示给其中这三个,也说明这三个值转换为列

as b    //b,随便填

结果为:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值