閱文時長 | | 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即可。