數據庫:SQLServer 實現行轉列、列轉行用法筆記

在許多的互聯網項目當中,報表開發是整個項目當中很重要的一個功能模塊。其中會有一些比較復雜的報表統計需要行轉列或者列轉行的需求。今天給大家簡單介紹一下在SQLServer當中如何使用PIVOT、UNPIVOT內置函數實現數據報表的行轉列、列轉行。有需要的朋友可以一起學習一下。

一、PIVOT、UNPIVOT用途

官方解釋:可以使用 PIVOT 和 UNPIVOT 關系運算符將表值表達式更改為另一個表。PIVOT 通過將表達式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表達式,并在必要時對最終輸出中所需的任何其余列值執行聚合。UNPIVOT 與 PIVOT 執行相反的操作,將表值表達式的列轉換為列值。

注意:UNPIVOT運算符通過將列旋轉到行來執行PIVOT的反向操作,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 執行聚合,并將多個可能的行合并為輸出中的一行。UNPIVOT 不重現原始表值表達式的結果,因為行已被合并。另外,UNPIVOT 輸入中的 NULL 值也在輸出中消失了。如果值消失,表明在執行 PIVOT 操作前,輸入中可能就已存在原始 NULL 值。

二、PIVOT語法格式

SELECT <非透視的列>,

????[第一個透視的列] AS <列名稱>,

????[第二個透視的列] AS <列名稱>,

????...

????[最后一個透視的列] AS <列名稱>,

FROM

????(<生成數據的 SELECT 查詢>)

????AS <源查詢的別名>

PIVOT

(

????<聚合函數>(<要聚合的列>)

FOR

[<包含要成為列標題的值的列>]

????IN ( [第一個透視的列], [第二個透視的列],

????... [最后一個透視的列])

) AS <透視表的別名>

<可選的 ORDER BY 子句>;

三、行轉列示例說明

-- 創建測試表 學習成績統計表
CREATE  TABLE ScoreStatistics
(UserName         NVARCHAR(20),        --學生姓名SubjectName       NVARCHAR(30),        --科目名稱Score            FLOAT,               --成績
)
-- 插入測試數據
INSERT INTO ScoreStatistics SELECT '小王', '語文', 100
INSERT INTO ScoreStatistics SELECT '小王', '數學', 90.5
INSERT INTO ScoreStatistics SELECT '小王', '英語', 88
INSERT INTO ScoreStatistics SELECT '小王', '歷史', 65
INSERT INTO ScoreStatistics SELECT '小李', '語文', 81
INSERT INTO ScoreStatistics SELECT '小李', '數學', 99
INSERT INTO ScoreStatistics SELECT '小李', '英語', 95
INSERT INTO ScoreStatistics SELECT '小李', '歷史', 90
INSERT INTO ScoreStatistics SELECT '小劉', '語文', 90
INSERT INTO ScoreStatistics SELECT '小劉', '數學', 85
INSERT INTO ScoreStatistics SELECT '小劉', '英語', 59
INSERT INTO ScoreStatistics SELECT '小劉', '歷史', 98
-- 傳統寫法
select UserName,max(case SubjectName when '語文' then Score else 0 end)語文,max(case SubjectName when '數學'then Score else 0 end)數學,max(case SubjectName when '英語'then Score else 0 end)英語,max(case SubjectName when '歷史'then Score else 0 end)歷史
from ScoreStatistics
group by UserName
-- PIVOT 寫法更簡潔
SELECT * FROM ScoreStatistics
AS P
PIVOT
(SUM(Score/*行轉列后 列的值*/) FORp.SubjectName/*需要行轉列的列*/ IN ([語文],[數學],[英語],歷史/*列的值*/)
) AS T
-- order by 語文 desc  具體科目排序
-- order by username desc -- 姓名排序
-- 動態拼接列的示例
DECLARE @sql_str VARCHAR(8000); -- 要執行的sql
--拿到數值列 [歷史],[數學],[英語],[語文]
DECLARE @sql_col VARCHAR(8000);
SELECT @sql_col = ISNULL(@sql_col + ',','') 
+ QUOTENAME(SubjectName) 
FROM ScoreStatistics GROUP BY SubjectName;
print(@sql_col); -- 打印數值列,不必需
SET @sql_str = '
SELECT * FROM (
SELECT [UserName],[SubjectName],[Score] FROM [ScoreStatistics]) 
p PIVOT
(SUM([Score]) FOR [SubjectName] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.[UserName]'
PRINT (@sql_str);--打印執行的sql
EXEC (@sql_str);-- 執行查詢

輸出結果

UserName 語文 數學 英語 歷史

小王 100 90.5 88 65

小劉 90 85 59 98

小李 81 99 95 90

四、列轉行示例

-- 插入測試表CREATE  TABLE ScoreSummary(   UserName         NVARCHAR(20),        --學生姓名   數學        FLOAT,               --數學成績   英語             FLOAT,               --英語成績   語文             FLOAT,               --語文成績   歷史             FLOAT,               --歷史成績)-- 插入測試數據INSERT INTO ScoreSummary SELECT '小李',81,99,95,90;INSERT INTO ScoreSummary SELECT '小劉',90,85,59,98;INSERT INTO ScoreSummary SELECT '小王',100,90.5,88,65;-- 查詢用法select aa.UserName,aa.Scorefrom (select UserName,數學,英語,語文,歷史 from dbo.ScoreSummary) as aunpivot(Score for ScoreSummary in(數學,英語,語文,歷史)) as aa order by aa.UserName
輸出結果:

UserName Score

小李 81

小李 99

小李 95

小李 90

小劉 90

小劉 85

小劉 59

小劉 98

小王 100

小王 90.5

小王 88

小王 65

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦 SQL常用語句大全(值得收藏) 辦公技巧:常用的100個Word快捷鍵! GitHub上值得收藏的100個精選前端項目! 數據庫優化:SQL 查找是否"存在",別再 count 了,很耗費時間的! 學習 MySQL 高性能優化原理,這一篇就夠了! MySQL優化:數據量很大,分頁查詢很慢,有什么優化方案? 數據庫:MySQL中,當update修改數據與原數據相同時會再次執行嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271699.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

硬件知識:串口通訊的起始、數據、停止位是怎么分配的?

串口是串行接口&#xff08;serial port&#xff09;的簡稱&#xff0c;也稱為串行通信接口或COM接口。串口通信是指采用串行通信協議&#xff08;serial communication&#xff09;在一條信號線上將數據一個比特一個比特地逐位進行傳輸的通信模式。串口按電氣標準及協議來劃分…

ES5 getter setter

最近在學習vuejs&#xff0c;了解到內部實現使用到了es5的Getters和Setters。之前看高程的時候&#xff0c;沒有重視這塊&#xff0c;今天查看一下文檔&#xff0c;了解了他們的作用&#xff0c;再次記錄一下&#xff0c;可供以后查看和共享。 定義Getters和Setters&#xff1a…

python 調用bat失敗_要想順利通過Python面試,你最起碼需要達到白銀段位!

近幾年 Python 非常熱門&#xff0c;在學術界和產業界的使用率顯著提高。目前學習Python的人數日益增多&#xff0c;Python在近3年的編程語言受歡迎度中一直處于榜首。今天我們就來講講在產業界&#xff0c;需要具備哪些能力才能獲得一個滿意的 Python 相關崗位 Offer。Python基…

多線程售票demo,用ReentrantLock實現

代碼: public class TicketReentLockDemo implements Runnable {private int ticketTotal 100;private Lock lock new ReentrantLock();Overridepublic void run() {while (ticketTotal > 0) {try {lock.lock();if (ticketTotal > 0) {try {TimeUnit.MILLISECONDS.sle…

在linux安裝不了apache,Apache 不能安裝在linux?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓官網下載了tar.gz的文件&#xff0c; 然后tar解壓&#xff0c; 可是走到 ./configureprefix/usr/local/apache/ 的時候就開始出現一些“NO”我怕這樣make會有問題&#xff0c; 請問大家碰到出現"no"的選項嘛&#xff1f;…

andriod sqlite 詳解轉載

SQLite簡介 Google為Andriod的較大的數據處理提供了SQLite&#xff0c;他在數據存儲、管理、維護等各方面都相當出色&#xff0c;功能也非常的強大。SQLite具備下列特點&#xff1a; 1.輕量級 使用 SQLite 只需要帶一個動態庫&#xff0c;就可以享受它的全部功能&#xff0c;而…

數據庫:SQLServer中in和 exists函數用法筆記

今天給大家分享一下SQLServer中in和 exists 用法&#xff0c;希望能對大家有所幫助。一、IN 用法確定指定的值是否與子查詢或列表中的數據相匹配。1.1 語法格式test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )1.2 參數說明test_expression為任意有…

什么是m叉樹_不懂數據庫索引的底層原理?那是因為你心里沒點b樹

前幾天下班回到家后正在處理一個白天沒解決的bug&#xff0c;廁所突然傳來對象的聲音&#xff1a; 對象&#xff1a;xx&#xff0c;你有《時間簡史》嗎&#xff1f; 我&#xff1a;我去&#xff01;妹子&#xff0c;你這啥癖好啊&#xff0c;我有時間也不會去撿屎啊&#xff01…

可重入鎖是什么和demo

可重入鎖 reentrantlock是獨占鎖且可重入的 synchronized 也可以重入 可重入意思就是這個線程已經獲取鎖了&#xff0c;你再獲取該鎖還能獲取 獲取的還是原來的鎖 不會出現問題 可以降低編程難度 代碼如下: new Thread(new Runnable() {Overridepublic void run() {synchr…

linux 安裝python 3.x,Linux 安裝python3.x步驟

本文轉發自博客園非真的文章&#xff0c;內容略有改動linux系統本身默認安裝有2.x版本的python&#xff0c;版本x根據不同版本系統有所不同&#xff0c;通過python --V 或 python --version 查看系統自帶的python版本。有一些系統命令時需要用到python2&#xff0c;不能卸載&am…

數據庫:SQLServer中游標的用法筆記

一、游標的概念知識游標可以理解為SQL Server的一種數據訪問機制&#xff0c;它允許用戶訪問數據的維度是數據行。用戶可以對每一行數據進行單獨處理&#xff0c;從而降低系統開銷和潛在的阻隔情況&#xff0c;游標主要用于存儲過程&#xff0c;觸發器和 T_SQL復雜的腳本中&…

BZOJ_1009_[HNOI2008]_GT考試_(動態規劃+kmp+矩陣乘法優化+快速冪)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9組成,給出一個串s,求一個長度為n的串,不包含s的種類有多少. 分析 第一眼以為是組合.然后更滑稽的是用錯誤的方法手算樣例居然算出來是對的...我數學是有多差... 題解也是看了好半天,有點難理解. 感覺…

智慧政務解決方案(28頁)pdf_【金眾電子】智慧政務解決方案

智慧政務解決方案立式黨建廣告機廣告機簡介&#xff1a;KC-立式政務廣告機(室內/室外可選)液晶屏幕特別賣點&#xff1a;安裝簡易、亮度調節、實時更新、傳輸安全應用場所&#xff1a;各種需要文化傳播的政務機構、政府機關、會議場所等。雙立柱政務文化欄/宣傳欄文化欄簡介&am…

笨辦法學linux dhcp,了解網關、DNS、子網掩碼、MAC地址、DHCP

原標題&#xff1a;了解網關、DNS、子網掩碼、MAC地址、DHCP什么是網關、DNS、子網掩碼&#xff0c;它有什么作用&#xff0c;確實&#xff0c;我們平時在網絡中總是在不斷的提到網關&#xff0c;卻很少真正的去了解它。一、什么是網關1、什么是網關網關是一種充當轉換重任的計…

數據庫:SQLServer Stuff 函數用法筆記

今天小編給大家分享一下自己整理一下SQLServer Stuff函數用法技巧和常用示例&#xff0c;有需要的朋友可以學習一下。一、Stuff函數的作用1.1官方解釋STUFF 函數將字符串插入到另一個字符串中。 它從第一個字符串的開始位置刪除指定長度的字符&#xff1b;然后將第二個字符串插…

自定義注解,aop實現注解鎖

多線程環境下&#xff0c;會出現線程不安全的問題&#xff0c;所以要對某些方法加鎖以保證線程安全 但是如果方法過多&#xff0c;每個方法前后都加這么一句&#xff0c;有點麻煩了&#xff0c;而且代碼可讀性也會差一些。可以使用aop切面編程&#xff0c;對某些加有特定注解&…

Android——實現歡迎界面的自動跳轉(轉)

Android實現歡迎界面的自動跳轉&#xff0c;就是打開某一個安卓手機應用&#xff0c;出現的歡迎界面停留幾秒鐘&#xff0c;自動進入應用程序的主界面。在網上看到很多種實現辦法&#xff0c;但是感覺這種方法還是比較簡單的。 在onCreate里設置個Timer&#xff0c;然后建立Int…

手機端刷recovery工具_MIUI/REDMIN手機玩機匯集

愿你刷機半生歸來仍是MIUI1解鎖篇解鎖Bootloader準備工作&#xff1a;1.手機備份數據2.手機進入開發者模式①進入“設置 -> 我的設備 -> 全部參數"中連續點擊MIUI版本&#xff0c;進入”開發者模式“②進入“設置 -> 開發者選項 -> 設備解鎖狀態”中綁定賬號和…

數據結構基礎:線性表學習筆記

1、線性表定義線性表是指n個元素的有限序列(n>0),通常用(a1,a2,a3...,an),來表示。2、線性表特點1、存在唯一的一個首元素2、存在唯一一個尾元素3、除第首元素外&#xff0c;每個元素只有一個直接前驅。4、除尾元素外&#xff0c;每個元素只有一個直接后繼。3、線性表的存儲…

c語言流水燈小程序,流水燈小程序.doc

流水燈小程序流水燈小程序#include void delay() //延時函數&#xff0c;這里延時100ms{int i,j;for(i0;i<100;i){for(j0;j<2242;j){} //j循環一次大概1ms}}void main(){ //這里看LED原理圖LPC_IOCON->JTAG_TMS_PIO1_00x01;//定義p1.0引腳為輸出LPC_IOCON->JTAG_TD…