閱文時長 | | 0.74分鍾 | 字數統計 | | 1185.6字符 |
主要內容 | | 1、引言&背景 2、UNPIVOT基本語法結構 3、數據准備&行轉列實現 4、聲明與參考資料 | ||
『MSSQL·UNPIVOT關鍵字實現行轉列』 | |||
編寫人 | | SCscHero | 編寫時間 | | 2021/8/14 PM9:27 |
文章類型 | | 系列 | 完成度 | | 已完成 |
座右銘 | 每一個偉大的事業,都有一個微不足道的開始。 |
一、引言&背景 完成度:100%
a) 應對問題
UNPIVOT關鍵字如何實現行轉列?
b) 應對場景
- 如圖,員工第一季度工資表,實現行轉列。以單表的多個字段拆分成多行數據。

- 仍適用於多字段存儲同級數據的,例如學生成績表,按學生維度存儲各科學習成績。
二、UNPIVOT基本語法結構 完成度:100%
UNPIVOT語法結構如下:
-- UNPIVOT 語法
SELECT [columns not unpivoted],
[unpivot_column],
[value_column],
FROM
(<source query>)
AS <alias for the source data>
UNPIVOT ( [value_column] FOR [unpivot_column] IN ( <column_list> ) )
AS <alias for unpivot>
--[columns not unpivoted]: 固定列,即不經過轉換的,直接查出來的列。
--[unpivot_column]: 需要被拆分的列名稱。
--[value_column]: 需要被拆分的列對應的值。
--<source query>: 數據結果集。
--<alias for the source data>: 數據結果集別名,必須結構,可省略AS。
--<column_list>: 需要被拆分的各列的名稱。
--<alias for unpivot>: 行轉列過程結果集的別名,必須結構,可省略AS。
三、數據准備&行轉列實現 完成度:100%
a) 數據准備
--示例:員工工資表
USE SCscHero_001_SSMSCode
CREATE TABLE [dbo].[實戰設計_002_PIVOT實現行轉列]
(
[EID] INT NOT NULL PRIMARY KEY IDENTITY,
[EName] NCHAR(10) NULL,
[Year] NCHAR(10) NULL,
[JanuaryMoney] DECIMAL NULL,
[FebruaryMoney] DECIMAL NULL,
[MarMoney] DECIMAL NULL,
)
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'張三', '2021', 10, 0, 90);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'趙四', '2021', 10, 0, 60);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'王五', '2021', 10, 0, 80);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'李六', '2021', 10, 0, 30);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'田七', '2021', 10, 0, NULL);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'速八', '2021', 10, 0, 34);
INSERT INTO 實戰設計_002_PIVOT實現行轉列 VALUES(N'玖九', '2021', 10, 0, 8);
數據如下圖:

b) 行轉列實現
SELECT T.EID, T.EName, T.Year, --[columns not unpivoted]
T.Month, --[unpivot_column]
T.Money --[value_column]
FROM(SELECT * FROM dbo.實戰設計_002_PIVOT實現行轉列) AS UP
UNPIVOT([Money]
FOR --[value_column]
[Month] --[unpivot_column]
IN([JanuaryMoney], [FebruaryMoney], [MarMoney]) --column_list
) AS T;
四、聲明與參考資料 完成度:100%
原創博文,未經許可請勿轉載。
如有幫助,歡迎點贊、收藏、關注。如有問題,請評論留言!如需與博主聯系的,直接博客私信SCscHero即可。