`

《转》sql server行转列函数的理解

 
阅读更多

參考資料:使用 PIVOT 和 UNPIVOT http://technet.microsoft.com/zh-tw/library/ms177410.aspx

前言
T-SQL PIVOT的語法看了好幾次,今天終於看懂了到底在寫什麼了。把心得先記下免得又忘記。

PIVOT語法:
先看一下語法,如下:

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
   AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

老實說吧,第一眼、第二眼還是看不懂。從實用案例反推對照了好幾次,終於看懂了。

PIVOT語法剖析:

PIVOT的語法分三層,用三個步驟來使用。
第一步驟:先把要PIVOT的原始資料查詢(Query)好。
第二步驟:設定好PIVOT的欄位與方式。
第三步驟:依PIVOT好了的資料,呈現結果。

SELECT <non-pivoted column>,    ---- 第三步驟在此,呈現PIVOT後的資料。
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
   (<SELECT query that produces the data>) ---- 第一步驟在此,準備資料(Query)。
   AS <alias for the source query>
PIVOT ---- 第二步驟在此,依第一步驟的資料欄位來設定PIVOT方式。
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

用實戰案例說明:

實戰案例一:

--## 一維PIVOT 
目的:統計各狀態(ldap_sts)的數量。
select *  ---- 第三步:把PIVOT好的資料直接呈現出來。
from
(
    select [ldap_id], [ldap_sts] from ccldap   -- 第一步:準備資料。
          -- 只從原資料檔選了兩個欄位,PK欄位(ldap_id)與狀態欄位(ldap_sts)。
) S  -- 一定要有,不然會語法錯誤。
pivot
(
    count([ldap_id]) -- 統計計數數量
    for [ldap_sts] in ([1],[2],[3],[4],[5],[6],[7])  -- 為欄位[ldap_sts]的狀態值[1][2]…[7]進行統計計算。
-- 注意:[1][2]…[7]是[ldap_sts]的值,以欄位表示法來描述[ldap_sts]的值。
) P  -- 一定要有,不然會語法錯誤。

下面是執行結果:

1         2         3         4         5         6         7   <---狀態值
--------- --------- --------- --------- --------- --------- ---------
1         12528     68519     120       8         5         36  <---狀態數量

(1 個資料列受到影響)

======================================================
# 實戰案例二:

--## 二維PIVOT
目的:統計不同用途(app_rsn_cod )下,各狀態(ldap_sts)的數量。
select *  -- 第三步:把PIVOT好的資料直接呈現出來。
from
(
    select [ldap_id], [ldap_sts], [app_rsn_cod] from ccldap   -- 第一步:準備資料。
         -- 從原資料檔選了三個欄位,PK欄位(ldap_id)、狀態欄位(ldap_sts)與用途欄位(app_rsn_cod)。
) S  -- 一定要有,不然會語法錯誤。
pivot
(
    count([ldap_id])-- 統計計數數量
    for [ldap_sts] in ( [1],[2],[3],[4],[5],[6],[7])  -- 為欄位[ldap_sts]的狀態值[1][2]…[7]進行統計計算。
-- 注意:[1][2]…[7]是[ldap_sts]的值,以欄位表示法來描述[ldap_sts]的值。
) P

下面是執行結果:

(用途)      (狀態1)   (狀態2)   (狀態3)   (狀態4)   (狀態5)   (狀態6)   (狀態7)  
app_rsn_cod 1         2         3         4         5         6         7
----------- --------- --------- --------- --------- --------- --------- ---------
NULL        0         12515     59676     0         2         0         0
1           1         10        8104      1         4         5         0
2           0         3         739       119       2         0         36

(3 個資料列受到影響)

注意到了嗎,在此例的第二步驟,並未設定用途欄位(app_rsn_cod),但在最後的PIVOT結果資料卻神奇的合併(join)成希望達到的效果。

分享到:
评论

相关推荐

    2009 年度十大 SQL Server 技巧文章

    在向2009年告别之际,我们来回顾一下过去的一年中最受欢迎的SQL Server技巧,包括了OPENROWSET、FILESTREAM等函数的用法、密码工具介绍以及DBA日常工作建议等内容。 通过对这些精华文章的再次回顾,希望可以帮助您...

    Microsoft SQL Server2005技术内幕:T-SQL查询(中文PDF版)part1

    深入讨论了sql server 2005中新增的t-sql编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握t-sql。  本书适合于专业数据库开发者、bi开发者、dba和以sql server...

    Microsoft SQL Server 2005 技术内幕:T-SQL程序设计(CHM格式)

    深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握T-SQL。  本书适合于专业数据库开发者、BI开发者、DBA和以SQL ...

    Sqlserver2000经典脚本

    介绍就不多说了,下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握T-SQL。  本书适合于专业数据库开发者、BI开发者、DBA和以SQL Server...

    SQLServer中的窗口函数

    理解窗口函数可以从理解聚合函数开始,我们知道聚合函数的概念,就是将某列多行中的值按照聚合规则合并为一行,比如说Sum、AVG等等,简单的概念如图1所示。图1.聚合函数因此,通常来说,聚合后的行数都要小于聚合前...

    sql server关键字详解大全(图文)

    下面把sqlserver中cross apply和outer apply关键字具体介绍展示如下: 1.CROSS APPLY 和OUTER APPLY MSDN解释如下(个人理解不是很清晰): 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于...

    Microsoft SQL Server2005技术内幕:T-SQL查询(中文PDF版)part2

    深入讨论了sql server 2005中新增的t-sql编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握t-sql。  本书适合于专业数据库开发者、bi开发者、dba和以sql server...

    Microsoft SQL Server2005技术内幕:T-SQL查询(中文PDF版)part4

    深入讨论了sql server 2005中新增的t-sql编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握t-sql。  本书适合于专业数据库开发者、bi开发者、dba和以sql server...

    Microsoft SQL Server2005技术内幕:T-SQL查询(中文PDF版)part3

    深入讨论了sql server 2005中新增的t-sql编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解复杂的逻辑并掌握t-sql。  本书适合于专业数据库开发者、bi开发者、dba和以sql server...

    Microsoft SQL Server 2008技术内幕:T-SQL查询

    本书全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    《SQL Server 2008管理员必备指南》适合所有SQL Server用户参考,更是数据库管理员的必备指南。 编辑推荐 《SQL Server 2008管理员必备指南》教你全面掌握SQL Server 2008的必备指南!这本实用指南讲述了SQL Server ...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    《SQL Server 2008管理员必备指南》适合所有SQL Server用户参考,更是数据库管理员的必备指南。 编辑推荐 《SQL Server 2008管理员必备指南》教你全面掌握SQL Server 2008的必备指南!这本实用指南讲述了SQL Server ...

    Inside Microsoft SQL Server 2008 - T-SQL Querying

    本书全面深入地介绍了Microsoft SQL Server 2008 中高级T-SQL 查询、性能优化等方面的内容,以及SQLServer 2008 新增加的一些特性。主要内容包括SQL 的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表...

    SQL Server 2008高级程序设计 4/6

     10.4 理解SQLCLR及SQL Server中的.NET编程  10.5 创建聚集函数  10.6 自定义数据类型  10.7 小结 第11章 事务和锁  11.1 事务  11.2 SQL Server日志的工作方式  11.3 锁和并发  11.4 设置隔离级别 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    《SQL Server 2008管理员必备指南》适合所有SQL Server用户参考,更是数据库管理员的必备指南。 编辑推荐 《SQL Server 2008管理员必备指南》教你全面掌握SQL Server 2008的必备指南!这本实用指南讲述了SQL Server ...

    SQL SERVER 2000开发与管理应用实例

    中文版SQL Server 2000开发与管理应用实例-目录: 第 1 章 安装和配置SQL Server 1 1.1 SQL Server的版本和版本选择 1 1.2 安装SQL Server的常见问题 3 1.3 如何理解实例 5 1.4 如何实现无值守安装 5 ...

Global site tag (gtag.js) - Google Analytics