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,随便填
结果为: