UNPIVOT

SQL指令_UNPIVOT橫向資料轉縱向查詢

陳淑敏 2017/12/30 15:25:03
12665

SQL指令_UNPIVOT橫向資料轉縱向查詢


簡介

介紹如何在資料庫中操作將資料橫轉縱向的需求。

作者

陳淑敏


1. 前言

當有需要將資料由橫向多欄位轉縱向表示(明細)的需求時,即可使用UNPIVO。此運算式適用於SQL Server 2005以上版本。

2. 開始前準備

實作此運算式是建立於以下版本的環境:
l  SQL Server 2016

3. 實作演練

l  先建立資料表 [Score] ,執行以下語法即可:
 

USE [Test] 

GO

 

/****** Object:  Table [dbo].[Score]    Script Date: 2017/12/27 上午 11:24:38 ******/

  SET ANSI_NULLS ON
  GO
  SET QUOTED_IDENTIFIER ON
  GO
 

CREATE TABLE [dbo].[Score]( 

       [ClassID] [varchar](10) NULL, 

       [StuID] [varchar](20) NULL, 

       [StuName] [nvarchar](20) NULL, 

       [StuGender] [char](1) NULL, 

       [MATH] [int] NULL, 

       [ENGLISH] [int] NULL, 

       [COMPUTER] [int] NULL 

) ON [PRIMARY] 

GO

 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-1', N'923101', N'魏小平', N'1', 98, 99, 78) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-1', N'923102', N'連小景', N'1', 78, 96, 78) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-1', N'923103', N'吕小賀', N'1', 84, 87, 63) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-1', N'923104', N'周小進', N'1', 76, 92, 98) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923201', N'游小康', N'1', 98, 99, 88) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923202', N'林小雨', N'2', 78, 92, 92) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923203', N'楊小群', N'1', 73, 93, 68) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923204', N'陳小恩', N'2', 89, 87, 98) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923205', N'谢小静', N'2', 95, 72, 92) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-2', N'923206', N'陳小芳', N'2', 93, 78, 68) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923301', N'歐小侃', N'1', 92, 71, 62) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923302', N'趙小剛', N'1', 90, 72, 79) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923303', N'黄小瀟', N'2', 80, 93, 93) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923304', N'程小龍', N'1', 81, 87, 89) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923305', N'盧小城', N'1', 62, 88, 92) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923306', N'董小偉', N'1', 82, 80, 80) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923307', N'王小源', N'1', 85, 90, 92) 

INSERT [dbo].[Score] ([ClassID], [StuID], [StuName], [StuGender], [MATH], [ENGLISH], [COMPUTER]) VALUES (N'3-3', N'923308', N'周小希', N'2', 99, 100, 92)

 
 
l  撈取已建立完成的資料表 [Score]
   
SELECT * FROM [dbo].[Score]
  撰寫 UNPIVOT 運算子,撈取資料表 [SCORE] MATH ENGLISH COMPUTER 欄位由橫轉縱,以呈現出每個人各科每筆資料成績。
 

--資料轉換

select ClassID , StuID , StuName , [Subject] , Score
from Score
UNPIVOT
(
Score FOR [Subject] IN ( MATH , ENGLISH , COMPUTER )
) PV

4. 參考來源

l  https://wingti.wordpress.com/2012/05/09/sql-%E4%BD%BF%E7%94%A8-unpivot/

l  http://deanma.blogspot.tw/2012/04/ms-sql-unpovit.html?m=1

陳淑敏