SQL Server编程积累之:Pivot和Unpivot

在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难。这里,我将使用Pivot和unpivot来实现看似复杂的功能。这个功能在SQL2005及以上版本才有。

MSDN解释:

可以使用PIVOT和UNPIVOT关系运算符将表值表达式更改为另一个表。PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出所需的任何其余列值执行聚合。Unpivot与pivot执行相反的操作,将表值表达式的列转换为列值,但是在实际应用中,有些聚合之后的数据很难进行拆分。所以,unpivot并非pivot的逆过程。

pivot提供的语法比一系列复杂的select  ...case语法所指定的语法更简单和更具可读性。

例子:

-------------------行转列

----建表

复制代码
create table test(编号 int,姓名 varchar(20),季度 int,销售额 int) 
insert into test values(1,'simon',1,1000)
insert into test values(1,'simon',2,2000)
insert into test values(1,'simon',3,3000)
insert into test values(1,'simon',4,4000)
insert into test values(2,'meme',1,5000)
insert into test values(2,'meme',2,6000)
insert into test values(2,'meme',3,7000)
insert into test values(2,'meme',4,8000)
复制代码

--执行普通查询

select * from test

--执行转换的查询

复制代码
select  编号,姓名,
[1] as "一季度"
[2] as "二季度"
[3] as "三季度"
[4] as "四季度"
[5] as "随便"
form
test
pivot

sum(销售额)
for 季度 in ([1],[2],[3],[4],[5])


as pvt
复制代码

-----列转行

----建表

create table test2(编号 int,姓名 varchar(20), 一季度 int, 二季度 int, 三季度 int, 四季度 int)
insert into test2 values(1,'simon',1000,2000,4000,5000)
insert into test2 values(2,'meme',3000,3500,4200,5500)

---执行普通查询

select * from test2

--执行转换查询

复制代码
select [编号],[姓名],[季度],[销售额]
from test2
unpivot
(

销售额
for 季度 in
(一季度,二季度,三季度,四季度)

) as upvt
复制代码

查询结果

以下是带批注的 PIVOT 语法。

SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

    [第二个透视的列] AS <列名称>,

    ...

[最后一个透视的列] AS <列名称>,

FROM

    (<生成数据的 SELECT 查询>)

    AS <源查询的别名>

PIVOT

(

    <聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

    IN ( [第一个透视的列], [第二个透视的列],

    ... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;

详情请参照:http://technet.microsoft.com/zh-cn/library/ms177410.aspx

posted @   指尖流淌  阅读(790)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示