最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL中如何將行轉(zhuǎn)成列詳解

 更新時間:2022年11月02日 08:54:15   作者:流楚丶格念  
行列轉(zhuǎn)換在做報表分析時還是經(jīng)常會遇到的,今天就說一下如何實現(xiàn)行列轉(zhuǎn)換吧,下面這篇文章主要給大家介紹了關(guān)于SQL中如何將行轉(zhuǎn)成列的相關(guān)資料,需要的朋友可以參考下

天天這需求就神奇?。。。?/p>

SQL中怎么將行轉(zhuǎn)成列?

我們以MySQL數(shù)據(jù)庫為例,來說明行轉(zhuǎn)列的實現(xiàn)方式。

首先,假設(shè)我們有一張分數(shù)表(tb_score),表中的數(shù)據(jù)如下圖:

然后,我們再來看一下轉(zhuǎn)換之后需要得到的結(jié)果,如下圖:

可以看出,這里行轉(zhuǎn)列是將原來的subject字段的多行內(nèi)容選出來,作為結(jié)果集中的不同列,并根據(jù)userid進行分組顯示對應(yīng)的score。通常,我們有兩種方式來實現(xiàn)這種轉(zhuǎn)換。

1. 使用 CASE…WHEN…THEN 語句實現(xiàn)行轉(zhuǎn)列,參考如下代碼:

SELECT userid, 
SUM(CASE `subject` WHEN '語文' THEN score ELSE 0 END) as '語文', 
SUM(CASE `subject` WHEN '數(shù)學(xué)' THEN score ELSE 0 END) as '數(shù)學(xué)', 
SUM(CASE `subject` WHEN '英語' THEN score ELSE 0 END) as '英語', 
SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治' 
FROM tb_score 
GROUP BY userid

注意,SUM() 是為了能夠使用GROUP BY根據(jù)userid進行分組,因為每一個userid對應(yīng)的
subject="語文"的記錄只有一條,所以SUM() 的值就等于對應(yīng)那一條記錄的score的值。假如userid ='001' and subject='語文' 的記錄有兩條,則此時SUM() 的值將會是這兩條記錄的和,同理,使用Max()的值將會是這兩條記錄里面值最大的一個。但是正常情況下,一個user對應(yīng)一個subject只有一個分數(shù),因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函數(shù)都可以達到行轉(zhuǎn)列的效果。

2. 使用 IF() 函數(shù)實現(xiàn)行轉(zhuǎn)列,參考如下代碼:

SELECT userid, 
SUM(IF(`subject`='語文',score,0)) as '語文', 
SUM(IF(`subject`='數(shù)學(xué)',score,0)) as '數(shù)學(xué)', 
SUM(IF(`subject`='英語',score,0)) as '英語', 
SUM(IF(`subject`='政治',score,0)) as '政治' 
FROM tb_score 
GROUP BY userid

注意, IF(subject='語文',score,0) 作為條件,即對所有subject='語文’的記錄的score字段進行SUM()、MAX()、MIN()、AVG()操作,如果score沒有值則默認為0。

補充:列轉(zhuǎn)行:union

列轉(zhuǎn)行是上述過程的逆過程,所以其思路也比較直觀:

  • 行記錄由一行變?yōu)槎嘈校凶侄斡啥嗔凶優(yōu)閱瘟校?/li>
  • 一行變多行需要復(fù)制,列字段由多列變單列相當于是堆積的過程,其實也可以看做是復(fù)制;
  • 一行變多行,那么復(fù)制的最直觀實現(xiàn)當然是使用union,即分別針對每門課程提取一張衍生表,最后將所有課程的衍生表union到一起即可,其中需要注意字段的對齊

按照這一思路,給出SQL實現(xiàn)如下:

SELECT uid,      
		sum(if(course='語文', score, NULL)) as `語文`,      				sum(if(course='數(shù)學(xué)', score, NULL)) as `數(shù)學(xué)`,      				sum(if(course='英語', score, NULL)) as `英語`,      				sum(if(course='物理', score, NULL)) as `物理`,      
		sum(if(course='化學(xué)', score, NULL)) as `化學(xué)`FROM scoreLongGROUP BY uid

查詢結(jié)果當然是預(yù)期的長表。這里重點解釋其中的三個細節(jié):

在每個單門課的衍生表中,例如這句:SELECT uid, ‘語文’ as course, 語文 as score,用單引號包裹起來的課程名稱是字符串常量,比如語文課的衍生表中的課程名都叫語文,然后將該列命名為course;第二個用反引號包裹起來的課程名實際上是從寬表中引用這一列的取值,然后將其命名為score。

這實際上對應(yīng)的一個知識點是:在SQL中字符串的引用用單引號(其實雙引號也可以),而列字段名稱的引用則是用反引號.

上述用到了where條件過濾成績?yōu)榭罩档挠涗洠@實際是由于在原表中存在有空值的情況,如不加以過濾則在本例中最終查詢記錄有10條,其中兩條記錄的成績字段為空

最后,本例中用union關(guān)鍵字實現(xiàn)了多表的縱向拼接,實際上用union all更為合理,二者的區(qū)別是union會完成記錄去重;而union all則簡單的拼接,在確定不存在重復(fù)或無需去重的情況下其效率更高。

總結(jié)

到此這篇關(guān)于SQL中如何將行轉(zhuǎn)成列的文章就介紹到這了,更多相關(guān)SQL將行轉(zhuǎn)成列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql 5.6.37 winx64安裝雙版本mysql筆記記錄

    Mysql 5.6.37 winx64安裝雙版本mysql筆記記錄

    機器上現(xiàn)在已經(jīng)存在5.0版本MySQL的情況下裝一個最新版的mysql,下文通過實例代碼給大家介紹Mysql 5.6.37 winx64安裝雙版本mysql筆記記錄,感興趣的朋友一起看看吧
    2017-07-07
  • MySQL中DATE_FORMAT()函數(shù)的具體使用

    MySQL中DATE_FORMAT()函數(shù)的具體使用

    本文主要介紹了MySQL中DATE_FORMAT()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 一篇文章講解清楚MySQL索引

    一篇文章講解清楚MySQL索引

    這篇文章主要用一篇文章講解清楚MySQL索引的相關(guān)資料,十分的細致全面,推薦給大家,需要的朋友可以參考下
    2022-10-10
  • 你知道哪幾種MYSQL的連接查詢

    你知道哪幾種MYSQL的連接查詢

    連接(join)查詢是將兩個查詢的結(jié)果以“橫向?qū)印钡姆绞胶喜⑵饋淼慕Y(jié)果,這篇文章主要給大家介紹了關(guān)于MYSQL連接查詢的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • mysql中varchar類型的日期進行比較、排序等操作的實現(xiàn)

    mysql中varchar類型的日期進行比較、排序等操作的實現(xiàn)

    在mysql使用過程中,日期一般都是以datetime、timestamp等格式進行存儲的,但有時會因為特殊的需求或歷史原因,日期的存儲格式是varchar,那么應(yīng)該怎么進行比較和排序等問題,本文就來介紹一下
    2021-11-11
  • MySQL查詢進階操作從函數(shù)到表連接的使用

    MySQL查詢進階操作從函數(shù)到表連接的使用

    這篇文章主要介紹了MySQL查詢進階從函數(shù)到表連接的使用,包括mysql函數(shù)的使用,MySQL的分組分頁及查詢關(guān)鍵字的執(zhí)行順序,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 關(guān)于MySQL報警的一次分析處理詳解

    關(guān)于MySQL報警的一次分析處理詳解

    這篇文章主要給大家介紹了關(guān)于MySQL報警的一次分析處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySql查詢時間段的方法

    MySql查詢時間段的方法

    這篇文章主要介紹了MySql查詢時間段的方法,包括了傳統(tǒng)的針對時間字段的查詢方法與UNIX時間戳的查詢技巧,非常具有實用價值,需要的朋友可以參考下
    2014-12-12
  • 簡單談?wù)凪ySQL中的int(m)

    簡單談?wù)凪ySQL中的int(m)

    設(shè)置int型的時候,需要設(shè)置int(M),以前知道這個M最大是255,但是到底應(yīng)該設(shè)置多少并沒有在意。注意zerofill,今天我們來簡單探討下
    2016-09-09
  • 安裝mysql-8.0.19-winx64遇到的問題:Can''t create directory ''xxxx\Database\''

    安裝mysql-8.0.19-winx64遇到的問題:Can''t create directory ''xxxx\Da

    這篇文章主要介紹了安裝mysql-8.0.19-winx64遇到的坑 ,Can't create directory 'xxxx\Database\',非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02

最新評論

巴林左旗| 威信县| 唐河县| 灌南县| 双牌县| 平果县| 凤庆县| 西华县| 吉安县| 郧西县| 横峰县| 金寨县| 许昌县| 闻喜县| 大姚县| 聂拉木县| 阜平县| 防城港市| 颍上县| 调兵山市| 巴青县| 澄迈县| 交城县| 岚皋县| 古丈县| 正宁县| 偃师市| 广安市| 北票市| 福州市| 罗江县| 高陵县| 山阳县| 广灵县| 通榆县| 舟山市| 平凉市| 沧州市| 长乐市| 舟山市| 满洲里市|