MSSQL·PIVOT關鍵字實現列轉行


閱文時長 | 1.03分鍾 字數統計 | 1648.8字符
主要內容 | 1、引言&背景 2、PIVOT基本語法結構 3、數據准備&列轉行實現 4、聲明與參考資料
『MSSQL·PIVOT關鍵字實現列轉行』
編寫人 | SCscHero 編寫時間 | 2021/8/16 PM11:39
文章類型 | 系列 完成度 | 已完成
座右銘 每一個偉大的事業,都有一個微不足道的開始。

一、引言&背景   完成度:100%

a) 應對問題

如何使用PIVOT關鍵字實現列轉行?

b) 應對場景

例如本博文示例的RBAC的設計方式,常有用戶表、用戶-角色映射表、角色表三個對象。將其合並成一個表體展示。

二、PIVOT基本語法結構   完成度:100%

下面的語法是微軟官方總結的如何使用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>;

中文版是這樣的:

SELECT <非透視列>,  
    [第一個透視列] AS <column name>,  
    [第二個透視列] AS <column name>,  
    ...  
    [最后一個透視列] AS <column name>  
FROM  
    (<結果集>)   
    AS <源查詢的別名>  
PIVOT  
(  
    <聚合函數>(<要聚合的列>)  
FOR   
[<包含要成為列標題>]   
    IN ( [第一個透視列], [第二個透視列],  
    ... [最后一個透視列])  
) AS <透視表的別名>  
<可選-排序>;

三、數據准備&列轉行實現   完成度:100%

a) 數據准備


CREATE TABLE dbo.[實戰設計.002.UNPivot實現列轉行-用戶表]
(
				[UID] INT NOT NULL PRIMARY KEY IDENTITY, 
    [UName] NVARCHAR(20) NULL, 
)

CREATE TABLE dbo.[實戰設計.002.UNPivot實現列轉行-角色表]
(
				[RID] INT NOT NULL PRIMARY KEY IDENTITY, 
    [RName] NVARCHAR(20) NULL, 
)

CREATE TABLE dbo.[實戰設計.002.UNPivot實現列轉行-用戶-角色映射表]
(
    [MID] INT NOT NULL PRIMARY KEY IDENTITY, 
				[UID] INT NOT NULL,
				[RID] INT NOT NULL
)

INSERT dbo.[實戰設計.002.UNPivot實現列轉行-用戶表](UName)
VALUES(N'張五' -- UName - nvarchar(20)
    ),
(N'李四' -- UName - nvarchar(20)
    ),
(N'田七' -- UName - nvarchar(20)
    ),
(N'王八' -- UName - nvarchar(20)
    ),
(N'趙九' -- UName - nvarchar(20)
    )

INSERT	[dbo].[實戰設計.002.UNPivot實現列轉行-角色表]([RName])
VALUES(N'查看者' -- RName - nvarchar(20)
    ),
(N'操作者' -- RName - nvarchar(20)
    ),
(N'刪除者' -- RName - nvarchar(20)
    )

INSERT [dbo].[實戰設計.002.UNPivot實現列轉行-用戶-角色映射表]([UID], [RID])
VALUES(1, -- UID - int
1   -- RID - int
    ),
(1, -- UID - int
3   -- RID - int
    ),
(2, -- UID - int
2   -- RID - int
    ),
(2, -- UID - int
3   -- RName - int
    ),
(3, -- UID - int
3   -- RID - int
    ),
(5, -- UID - int
1   -- RID - int
 )

SELECT * FROM dbo.[實戰設計.002.UNPivot實現列轉行-用戶表]
SELECT * FROM dbo.[實戰設計.002.UNPivot實現列轉行-角色表]
SELECT * FROM dbo.[實戰設計.002.UNPivot實現列轉行-用戶-角色映射表]

b) 行轉列實現

SELECT T.UID, T.UName,--非透視列
 T.查看者, T.操作者, T.刪除者--第N個透視列
FROM(SELECT a.UID, a.UName, c.RID, c.RName
     FROM [實戰設計.002.UNPivot實現列轉行-用戶表] a
          LEFT JOIN [實戰設計.002.UNPivot實現列轉行-用戶-角色映射表] b ON a.UID=b.UID
          LEFT JOIN [實戰設計.002.UNPivot實現列轉行-角色表] c ON b.RID=c.RID) PT--結果集
PIVOT(COUNT(RID)--聚合函數
FOR RName IN([查看者], [操作者], [刪除者])) T;--透視列

四、聲明與參考資料   完成度:100%

原創博文,未經許可請勿轉載。

如有幫助,歡迎點贊、收藏、關注。如有問題,請評論留言!如需與博主聯系的,直接博客私信SCscHero即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM