一、使用PIVOT實現行轉列 1、首先創建一個學生表 CREATE TABLE [dbo].[Students]( [stu_id] [int] IDENTITY(1,1) NOT NULL, [stu_name] [varchar](100) NULL, [stu_hobby] [varchar] ...
一、使用PIVOT實現行轉列
1、首先創建一個學生表
CREATE TABLE [dbo].[Students](
[stu_id] [int] IDENTITY(1,1) NOT NULL,
[stu_name] [varchar](100) NULL,
[stu_hobby] [varchar](100) NULL,
[stu_hours] [int] NULL
) ON [PRIMARY]
2、插入幾條數據
INSERT INTO [Students](stu_name,stu_hobby,stu_hours)
VALUES ('用戶A','唱歌','2')
,('用戶A','跳舞','5')
,('用戶B','唱歌','5')
,('用戶B','跳舞','3')
,('用戶C','唱歌','1')
,('用戶C','跳舞','5')
,('用戶D','游泳','5')
,('用戶D','跳舞','5')
3、針對某一列將其轉化為列,這裡使用到的是stu_hobby
SELECT * FROM (
SELECT stu_name,stu_hobby,stu_hours FROM [Students]
)t
PIVOT(SUM(stu_hours)
FOR stu_hobby IN (唱歌,跳舞,游泳))piv
【效果對比如下:】
(1)轉換前:
(2) 轉換後:
4、如果我們想要動態把某一行轉換成列,並不想每次增加一種愛好都要去手動去改一下sql,我們可以通過聲明變數的方式來實現
4.1 這裡我們添加一種【健身】的愛好
INSERT INTO [Students](stu_name,stu_hobby,stu_hours)
VALUES ('用戶D','健身','5')
4.2 使用聲明變數的sql
DECLARE @sql VARCHAR(MAX);
DECLARE @tempField VARCHAR(MAX)=(SELECT STUFF((SELECT ','+stu_hobby FROM [Students] GROUP BY stu_hobby FOR XML PATH('')),1,1,''));
SET @sql='
SELECT * FROM (
SELECT stu_name,stu_hobby,stu_hours FROM [Students]
)t
PIVOT(SUM(stu_hours)
FOR stu_hobby IN ('+@tempField+'))piv
'
EXEC(@sql)
效果圖如下:
這樣你沒添加一種愛好,都會自動的去把這個愛好轉換成列,就不用每增加一種,就需要手動在in後面去把愛好補充上去了
二、使用UNPIVOT實現列轉行
1、這裡是將stu_hobby和stu_name兩列轉成了行展示
SELECT 轉換後欄位名,T,stu_hours FROM [Students]
UNPIVOT
(
T FOR 轉換後欄位名 IN(stu_hobby,stu_name)
)un
【效果對比如下:】
(1)轉換前:
(2)轉換後:
每日一記,提升自己!!!!