SQL Server行列轉(zhuǎn)換的實(shí)現(xiàn)示例
在使用SQL Server數(shù)據(jù)庫(kù)的過(guò)程中我們經(jīng)常會(huì)遇到需要將行數(shù)據(jù)和列數(shù)據(jù)相互轉(zhuǎn)換顯示的問(wèn)題。對(duì)于這個(gè)問(wèn)題SQL Server數(shù)據(jù)庫(kù)有專門的內(nèi)置函數(shù)PIVOT(行轉(zhuǎn)列)、UNPIVOT(列轉(zhuǎn)行)可以解決。下面我們就來(lái)分析一下這兩個(gè)函數(shù)的使用方法。
一、行轉(zhuǎn)列PIVOT
1、語(yǔ)法
select * from 源表名 as 表別名pivot( 聚合函數(shù)(源表需要聚合顯示的列的字段名)for 源表數(shù)據(jù)中需要轉(zhuǎn)換為列名的列的字段名 in (轉(zhuǎn)換后的列名1,轉(zhuǎn)換后的列名2…))as 表別名
2、舉個(gè)例子
先創(chuàng)建一個(gè)作為數(shù)據(jù)源的表插入少量數(shù)據(jù):
create table StudentScores ( StudentName varchar(16), Subject varchar(16), Score smallint ) insert into StudentScores values('張三','語(yǔ)文',85) insert into StudentScores values('張三','數(shù)學(xué)',90) insert into StudentScores values('張三','英語(yǔ)',86) insert into StudentScores values('李四','語(yǔ)文',92) insert into StudentScores values('李四','數(shù)學(xué)',87) insert into StudentScores values('李四','英語(yǔ)',90)
此時(shí) select * from StudentScores 直接查詢結(jié)果如下:
下面是我們使用PIVOT函數(shù)轉(zhuǎn)換后查詢出的結(jié)果,先看下代碼:
select * from StudentScores as s --源數(shù)據(jù) pivot(max(Score) for Subject in (語(yǔ)文,數(shù)學(xué),英語(yǔ))) as ss --轉(zhuǎn)換后的結(jié)果數(shù)據(jù)
查詢出的結(jié)果如圖:
二、列轉(zhuǎn)行UNPIVOT
1、語(yǔ)法
select * from 源表名 as 表別名
unpivot(定義由源表數(shù)據(jù)轉(zhuǎn)換成的列的列名 for 定義由源表字段名轉(zhuǎn)換成的列的列名 in
(源表字段名1,源表字段名2…)) as 表別名
2、實(shí)例
為求直觀直接用上面實(shí)例的結(jié)果數(shù)據(jù)創(chuàng)建一個(gè)新表:
create table StudentGrades ( StudentName varchar(16), 語(yǔ)文 smallint, 數(shù)學(xué) smallint, 英語(yǔ) smallint, ) insert into StudentGrades values('張三',85,90,86) insert into StudentGrades values('李四',92,87,90)
select * from StudentGrades直接查詢結(jié)果如下:
使用UNPIVOT函數(shù)進(jìn)行轉(zhuǎn)換,代碼如下:
select * from StudentGrades as sg --源數(shù)據(jù) unpivot(Score for Subject in (語(yǔ)文,數(shù)學(xué),英語(yǔ))) as cjd --轉(zhuǎn)換后的結(jié)果數(shù)據(jù)
結(jié)果如圖:
和PIVOT函數(shù)的實(shí)例中源數(shù)據(jù)的表基本相同。當(dāng)然我們也可以不創(chuàng)建新表直接使用以下代碼查詢出相同的結(jié)果:
select * from StudentScores as s pivot(max(Score) for Subject in (語(yǔ)文,數(shù)學(xué),英語(yǔ))) as ss unpivot(Score for Subject in (語(yǔ)文,數(shù)學(xué),英語(yǔ))) as cjd
通過(guò)上面的例子,我們簡(jiǎn)單了解了PIVOT和UNPIVOT這兩個(gè)函數(shù)的使用方法,在例子中我們用這兩個(gè)函數(shù)實(shí)現(xiàn)了數(shù)據(jù)的行列逆轉(zhuǎn)查詢,雖然UNPIVOT函數(shù)可以將PIVOT函數(shù)轉(zhuǎn)換后的結(jié)果還原成轉(zhuǎn)換前的樣子,但UNPIVOT 并不完全是 PIVOT 的逆操作。 PIVOT 執(zhí)行聚合,并將多個(gè)可能的行合并為輸出中的一行。 UNPIVOT 不重現(xiàn)原始表值表達(dá)式的結(jié)果,因?yàn)樾幸驯缓喜ⅰ?另外,UNPIVOT 輸入中的 NULL 值也在輸出中消失了。 如果值消失,表明在執(zhí)行 PIVOT 操作前,輸入中可能就已存在原始 NULL 值。
到此這篇關(guān)于SQL Server行列轉(zhuǎn)換的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SQL Server行列轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- sql 普通行列轉(zhuǎn)換
- 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句
- sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
- Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
- 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎn)換的問(wèn)題小結(jié)
- SQL Server使用PIVOT與unPIVOT實(shí)現(xiàn)行列轉(zhuǎn)換
- MySQL實(shí)現(xiàn)行列轉(zhuǎn)換
- SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
SQLServer設(shè)置客戶端使用IP地址登錄的圖文詳解
這篇文章主要介紹了SQLServer設(shè)置客戶端使用IP地址登錄的圖文詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12SQL SERVER 數(shù)據(jù)庫(kù)備份的三種策略及語(yǔ)句
這篇文章主要介紹了SQL SERVER 數(shù)據(jù)庫(kù)備份的三種策略及語(yǔ)句,需要的朋友可以參考下2017-02-02在SQL Server中實(shí)現(xiàn)最短路徑搜索的解決方法
本篇文章小編為大家介紹,在SQL Server中實(shí)現(xiàn)最短路徑搜索的解決方法。需要的朋友參考下2013-04-04SQL Server數(shù)據(jù)庫(kù)自動(dòng)收縮配置指南
在數(shù)據(jù)庫(kù)管理中,隨著數(shù)據(jù)的增刪,數(shù)據(jù)庫(kù)文件的大小會(huì)不斷變化,導(dǎo)致空間浪費(fèi)和性能下降,SQL Server提供了自動(dòng)收縮功能,本文將深入探討如何在SQL Server中配置數(shù)據(jù)庫(kù)的自動(dòng)收縮,需要的朋友可以參考下2024-07-07收縮后對(duì)數(shù)據(jù)庫(kù)的使用有影響嗎?
收縮后對(duì)數(shù)據(jù)庫(kù)的使用有影響嗎?...2007-07-07sql 查詢結(jié)果合并union all用法_數(shù)據(jù)庫(kù)技巧
sql語(yǔ)句查詢結(jié)果合并union all用法_數(shù)據(jù)庫(kù)技巧,需要的朋友可以參考下。2009-11-11