SQL Server行列轉(zhuǎn)換的實現(xiàn)示例
在使用SQL Server數(shù)據(jù)庫的過程中我們經(jīng)常會遇到需要將行數(shù)據(jù)和列數(shù)據(jù)相互轉(zhuǎn)換顯示的問題。對于這個問題SQL Server數(shù)據(jù)庫有專門的內(nèi)置函數(shù)PIVOT(行轉(zhuǎn)列)、UNPIVOT(列轉(zhuǎn)行)可以解決。下面我們就來分析一下這兩個函數(shù)的使用方法。
一、行轉(zhuǎn)列PIVOT
1、語法
select * from 源表名 as 表別名pivot( 聚合函數(shù)(源表需要聚合顯示的列的字段名)for 源表數(shù)據(jù)中需要轉(zhuǎn)換為列名的列的字段名 in (轉(zhuǎn)換后的列名1,轉(zhuǎn)換后的列名2…))as 表別名
2、舉個例子
先創(chuàng)建一個作為數(shù)據(jù)源的表插入少量數(shù)據(jù):
create table StudentScores
(
StudentName varchar(16),
Subject varchar(16),
Score smallint
)
insert into StudentScores
values('張三','語文',85)
insert into StudentScores
values('張三','數(shù)學(xué)',90)
insert into StudentScores
values('張三','英語',86)
insert into StudentScores
values('李四','語文',92)
insert into StudentScores
values('李四','數(shù)學(xué)',87)
insert into StudentScores
values('李四','英語',90)此時 select * from StudentScores 直接查詢結(jié)果如下:

下面是我們使用PIVOT函數(shù)轉(zhuǎn)換后查詢出的結(jié)果,先看下代碼:
select * from StudentScores as s --源數(shù)據(jù) pivot(max(Score) for Subject in (語文,數(shù)學(xué),英語)) as ss --轉(zhuǎn)換后的結(jié)果數(shù)據(jù)
查詢出的結(jié)果如圖:

二、列轉(zhuǎn)行UNPIVOT
1、語法
select * from 源表名 as 表別名
unpivot(定義由源表數(shù)據(jù)轉(zhuǎn)換成的列的列名 for 定義由源表字段名轉(zhuǎn)換成的列的列名 in
(源表字段名1,源表字段名2…)) as 表別名
2、實例
為求直觀直接用上面實例的結(jié)果數(shù)據(jù)創(chuàng)建一個新表:
create table StudentGrades
(
StudentName varchar(16),
語文 smallint,
數(shù)學(xué) smallint,
英語 smallint,
)
insert into StudentGrades
values('張三',85,90,86)
insert into StudentGrades
values('李四',92,87,90)select * from StudentGrades直接查詢結(jié)果如下:

使用UNPIVOT函數(shù)進行轉(zhuǎn)換,代碼如下:
select * from StudentGrades as sg --源數(shù)據(jù) unpivot(Score for Subject in (語文,數(shù)學(xué),英語)) as cjd --轉(zhuǎn)換后的結(jié)果數(shù)據(jù)
結(jié)果如圖:

和PIVOT函數(shù)的實例中源數(shù)據(jù)的表基本相同。當(dāng)然我們也可以不創(chuàng)建新表直接使用以下代碼查詢出相同的結(jié)果:
select * from StudentScores as s pivot(max(Score) for Subject in (語文,數(shù)學(xué),英語)) as ss unpivot(Score for Subject in (語文,數(shù)學(xué),英語)) as cjd
通過上面的例子,我們簡單了解了PIVOT和UNPIVOT這兩個函數(shù)的使用方法,在例子中我們用這兩個函數(shù)實現(xiàn)了數(shù)據(jù)的行列逆轉(zhuǎn)查詢,雖然UNPIVOT函數(shù)可以將PIVOT函數(shù)轉(zhuǎn)換后的結(jié)果還原成轉(zhuǎn)換前的樣子,但UNPIVOT 并不完全是 PIVOT 的逆操作。 PIVOT 執(zhí)行聚合,并將多個可能的行合并為輸出中的一行。 UNPIVOT 不重現(xiàn)原始表值表達(dá)式的結(jié)果,因為行已被合并。 另外,UNPIVOT 輸入中的 NULL 值也在輸出中消失了。 如果值消失,表明在執(zhí)行 PIVOT 操作前,輸入中可能就已存在原始 NULL 值。
到此這篇關(guān)于SQL Server行列轉(zhuǎn)換的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SQL Server行列轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- sql 普通行列轉(zhuǎn)換
- 一個簡單的SQL 行列轉(zhuǎn)換語句
- sqlserver2005 行列轉(zhuǎn)換實現(xiàn)方法
- Sql實現(xiàn)行列轉(zhuǎn)換方便了我們存儲數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
- 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫行列轉(zhuǎn)換
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過pivot對數(shù)據(jù)進行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實現(xiàn)行列轉(zhuǎn)換的問題小結(jié)
- SQL Server使用PIVOT與unPIVOT實現(xiàn)行列轉(zhuǎn)換
- MySQL實現(xiàn)行列轉(zhuǎn)換
- SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
SQLSERVER加密解密函數(shù)(非對稱密鑰 證書加密 對稱密鑰)使用方法代碼
這篇文章主要介紹了SQLSERVER加密解密函數(shù)使用方法,使用了非對稱密鑰、證書加密、對稱密鑰、通行短語(PassPhrase)加密,大家參考使用吧2013-11-11
SQL Server中調(diào)用C#類中的方法實例(使用.NET程序集)
這篇文章主要介紹了SQL Server中調(diào)用C#類中的方法實例(使用.NET程序集),本文實現(xiàn)了在SQL Server中調(diào)用C#寫的類及方法,需要的朋友可以參考下2014-10-10
SqlServer開發(fā)神器'SQLPrompt'插件的使用詳解
SQLPrompt是Sql?Server?開發(fā)智能提示插件,方便查詢表結(jié)果,避免了開發(fā)人員一個個敲查詢語句、執(zhí)行語句等,這篇文章主要介紹了SqlServer數(shù)據(jù)庫開發(fā)神器'SQLPrompt插件'的使用說明,需要的朋友可以參考下2023-03-03
SQL Server 性能調(diào)優(yōu)之查詢從20秒至2秒的處理方法
這篇文章主要介紹了SQL Server 性能調(diào)優(yōu)之查詢從20秒至2秒的處理方法,需要的朋友可以參考下2017-07-07
SQLServer中JSON文檔型數(shù)據(jù)的查詢問題解決
SQL Server 對于數(shù)據(jù)平臺的開發(fā)者來說越來越友好,下面這篇文章主要給大家介紹了關(guān)于SQLServer中JSON文檔型數(shù)據(jù)的查詢問題的解決方法,需要的朋友可以參考下2021-06-06
將mater庫中的系統(tǒng)存儲過程批量生成*.sql文件 通用且非常實用
最近因為系統(tǒng)需要,需要將master庫的所有和業(yè)務(wù)相關(guān)的存儲過程批量生成 存儲過程名.sql 文件,默認(rèn)是不可以導(dǎo)出的2012-05-05
Sql Server 2012 分頁方法分析(offset and fetch)
最近在分析 Sql Server 2012 中 offset and fetch 的新特性,發(fā)現(xiàn) offset and fetch 無論語法的簡潔還是功能的強大,都是相當(dāng)相當(dāng)不錯的2012-08-08

