SQL Server中行轉列和列轉行的那些事兒

2021-03-02 贏在辦公室


       本公眾號旨在分享日常辦公中常用的編程類技能(如excel、SQL SERVER、C#、JAVA等)和管理學常識、經典國學知識,以不斷提高辦公效率、工作質量和綜合業務能力。       覺得有用、喜歡請點擊上方藍色贏在辦公室關注公眾號,更多乾貨等你來學習分享。行轉列、列轉行是我們在開發過程中經常碰到的問題。行轉列一般通過CASE WHEN 語句來實現,也可以通過 SQL SERVER 的運算符PIVOT來實現。用傳統的方法,比較好理解。層次清晰,而且比較習慣。但是PIVOT 、UNPIVOT提供的語法比一系列複雜的SELECT…CASE 語句中所指定的語法更簡單、更具可讀性。下面我們通過幾個簡單的例子來介紹一下列轉行、行轉列問題。
我們首先先通過一個老生常談的例子,學生成績表(下面簡化了些)來形象了解下行轉列

如果我想知道每位學生的每科成績,而且每個學生的全部成績排成一行,這樣方便我查看、統計,導出數據

查詢結果如圖所示,這樣我們就能很清楚的了解每位學生所有的成績了

 

接下來我們來看看第二個小列子。有一個遊戲玩家充值表(僅僅為了說明,舉的一個小例子)

下面來了一個統計數據的需求,要求按日期、支付方式來統計充值金額信息。這也是一個典型的行轉列的例子。我們可以通過下面的腳本來達到目的

如圖所示,我們這樣只是得到了這樣的輸出結果:

還需進一步處理,才能得到想要的結果

其實行轉列,關鍵是要理清邏輯,而且對分組(Group by)概念比較清晰。上面兩個列子基本上就是行轉列的類型了。但是有個問題來了,上面是我為了說明弄的一個簡單列子。實際中,可能支付方式特別多,而且邏輯也複雜很多,可能涉及匯率、手續費等等,如果支付方式特別多,我們的CASE WHEN 會弄出一大堆,確實比較惱火,而且新增一種支付方式,我們還得修改腳本如果把上面的腳本用動態SQL改寫一下,我們就能輕鬆解決這個問題

下面是通過PIVOT來進行行轉列的用法,大家可以對比一下,確實要簡單、更具可讀性

有時可能會出現這樣的錯誤:

消息 325,級別 15,狀態 1,第 9 行

『PIVOT』 附近有語法錯誤。您可能需要將當前資料庫的兼容級別設置為更高的值,以啟用此功能。有關存儲過程 sp_dbcmptlevel 的信息,請參見幫助。

這個是因為:對升級到 SQL Server 2005 或更高版本的資料庫使用 PIVOT 和 UNPIVOT 時,必須將資料庫的兼容級別設置為 90 或更高。有關如何設置資料庫兼容級別的信息,請參閱 sp_dbcmptlevel (Transact-SQL)。例如,只需在執行上面腳本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是所在資料庫的名稱。

下面我們來看看列轉行,主要是通過UNION ALL ,MAX來實現。假如有下面這麼一個表

我們可以通過下面的腳本來實現,查詢結果如下圖所示

用UNPIVOT 實現如下:

- - - -End - - - -

文章來源|www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 作者:瀟湘隱者

尊重原創,感謝原創,如有侵權,本文立刪。

相關焦點

  • 5分鐘學會SQL SERVER行轉列、列轉行,PIVOT操作
    PIVOT 通過將表達式中的一個列的唯一值轉換為輸出中的多列(即行轉列),來輪替表值表達式。PIVOT 在需要對最終輸出所需的所有剩餘列值執行聚合時運行聚合。與 PIVOT 執行的操作相反,UNPIVOT 將表值表達式的列輪換為行(即列轉行)。但是需要注意的是,UNPIVOT 並不完全是 PIVOT 的逆操作。PIVOT 執行聚合,並將多個可能的行合併為輸出中的一行。
  • SQL SERVER 行轉列 PIVOT 用法及解釋
    在資料庫操作過程中,偶爾會使用到《行轉列》查詢;下面介紹Sql server 中常用的行轉列操作;1.語法
  • SQL Server 動態行轉列(參數化表名、分組列、行轉列欄位、欄位值)
    今天跟大家分享SQL Server 動態行轉列(參數化表名、分組列、行轉列欄位、欄位值)的知識。,動態列欄位;擴展閱讀一:參數化表名、分組列、行轉列欄位、欄位值;擴展閱讀二:在前面的基礎上加入條件過濾;二.背景(Contexts)其實行轉列並不是一個什麼新鮮的話題了,甚至已經被大家說到爛了,網上的很多例子多多少少都有些問題,所以我希望能讓大家快速的看到執行的效果。
  • MySQL資料庫的分組操作,語句拼接,列轉行操作
    本文介紹MySQL資料庫的分組操作,語句拼接,列轉行操作。說明:僅是MySQL5.7中存在,5.6和8.0都沒有,查看sql_modeselect @@sql_mode;在帶有group by 子句的select中,select後的條件列(非主鍵列),要麼是group by 後面的列,要麼需要在函數中
  • 【SQL】行轉列
    但是有的時候為了方便分析,需要把行形式的數據展開成列形式的。本文主要就是介紹幾種行轉列的方法,以及我自己由淺入深的思考。中,IF函數和CASE WHEN這兩種用法均可以使用。SELECT <非透視的列>, [第一個透視的列] AS <列名稱>, [第二個透視的列] AS <列名稱>, ...
  • SQL Server 2014 可更新聚集列存儲索引
    一、什麼是可更新聚集列存儲索引  聚集列存儲索引的概念可以類比於傳統的行存儲,聚集索引是數據本身,列存儲的概念也是一樣。相比行存儲索引,使用列存儲索引有如下好處:  ·首先對於聚合、掃描、分組等大查詢類操作僅僅需要讀取選擇的列,對於需要Join多個表的星型結構等場景的查詢性能提升尤其明顯;  ·其次是列索引可以更新,並且每個表中只需要一個聚集列索引即可,簡化了維護操作;  ·列索引由於是按列存儲,同一列中數據類型是一樣的,因此可以更容易的實現更高壓縮比;  ·列存儲的表由於非常高的壓縮比率
  • 如何使用 SQL Server FILESTREAM 存儲非結構化數據?
    2將創建一個$ FSLOG文件夾和文件filestream.hdr。下一步要創建一個具有列VARBINARY (MAX)和FILESTREAM屬性(腳本3)的表。USE Test_FILESTREAMCREATETABLE [dbo].
  • NET開發-SQL語句在SQL Server中查詢全部列、指定列和前n條數據
    查詢表中指定列的數據在SQL Server中,可以使用SQL語句只查詢出來需要的列數據,而不是所有的列數據。SQL基本語法如下:select 列名1,列名2,列名3,列名n fr om 表名例如:將BW_Student表中Name和Age列數據全部查詢出來。
  • Excel – 一列轉多列,多列轉一列,一個「=」搞定
    關於一維表和二維表的互相轉化方法,我真的寫過很多種了。且不說在各種案例中順帶提到的技巧,單獨開篇講的,就有以下這些:Excel快速將一列數據排列成m行*n列Excel indirect 函數(1) - 將一列數據排列成m行*n列Excel 一維錶轉二維表(填坑貼)Excel 如何將多列數據轉換成一列
  • SQL Server 2014
    SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統;同時也是資料庫腳本文件的擴展名。安裝步驟:注意:安裝過程需要電腦連接網絡,中途不能斷網。1. 請將下載文件複製到除C盤以外的盤符,土豪請隨意,如果系統為32位系統。
  • SQL Server 2019安裝教程
    Microsoft SQL Server 資料庫引擎為關係型數據和結構化數據提供了更安全可靠的存儲功能,使您可以構建和管理用於業務的高可用和高性能的數據應用程式。1、選中下載的【sql_server_2019】軟體壓縮包,滑鼠右擊選擇【解壓到sql_server_2019】。2、雙擊打開解壓後的【sql_server_2019】文件夾。
  • SQL Server應用程式的高級Sql注入
    [概 要] 這篇文章討論常用的"sql注入"技術的細節,應用於流行的Ms IIS/ASP/SQL-Server平臺。這裡探討有關這種攻擊各種可以注入程序訪問數據和資料庫防範的方法。一個典型的SQL語句是這樣的: select id, forename, surname from authors 這個查詢語句將會從'authors'表中返回'id','forename'和'surname'列的所有行。
  • SQL Server 安裝步驟
    本文通過圖文並茂的形式給大家介紹了SQL server 2016 安裝步驟,非常不錯,具有參考借鑑價值,需要的朋友參考下吧。
  • 不一樣的 SQL Server 日期格式化
    | date | DateTime日期和時間 | time | TimeSpan日期和時間 | DATETIME | DateTime日期和時間 | smalldatetime | DateTime日期和時間 | datetime2 | DateTime日期和時間 | datetimeoffset | DateTimeOffsetformatnvarchar 格式模式。
  • 用Select×進行SQL查詢的七宗罪
    與此同時,網絡帶寬的增加也就意味著:那些真正為用戶所需要的數據將會花費更長的時間,才能被傳送到客戶端的應用程式上。   3.更多的應用內存   隨著業務數據的猛增,您的應用程式可能需要使用更多的內存,來保存由此類查詢方式所產生的,可能來自Microsoft SQL Server(請參見http://www.java67.com/2018/01/top-4-free-microsoft-sql-server-books.html
  • 神奇的 SQL → 為什麼 GROUP BY 之後不能直接引用原表中的列?
    為什麼 GROUP BY 之後不能直接引用原表(不在 GROUP BY 子句)中的列 ?莫急,我們慢慢往下看。SQL 模式MySQL 伺服器可以在不同的 SQL 模式下運行,並且可以針對不同的客戶端以不同的方式應用這些模式,具體取決於 sql_mode 系統變量的值。
  • Windows下Laravel 7.0連接sql server - php中文網
    laravel 7.0 默認連接 mysql, 同時項目需要連接 sql servel (另一個系統應用)$users = DB::connection (『php_sqlsrv』)->select (…);
  • 實戰:SQL sever如何實現同一列上下行運算?
    今天講講資料庫SQL server的相關知識,如果要將一個表裡的兩列進行運算,那麼我們可以直接用欄位進行運算,如A+B或A-B,其中A和B是兩個不同列的欄位名。偏移後的數據顯示從上面的示例中我們可以看出:針對列OneArgs,組內的NUM列的值默認向下偏移了一行,每組的第一行用NULL來代替
  • 超全sql語句全集值得收藏
    首頁 > 語言 > 關鍵詞 > 收藏最新資訊 > 正文 超全sql語句全集值得收藏
  • SQL where
    where子句語法:SELECT 列名稱 FROM 表名稱 where 列 運算符 值在where子句中常用的運算符有:運算符描述=等於<>注:SQL一些版本(sql server 2014)可寫成!