亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

天天這需求就神奇!?。?!

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

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

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

然后,我們?cè)賮砜匆幌罗D(zhuǎn)換之后需要得到的結(jié)果,如下圖:

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

1. 使用 CASE…WHEN…THEN 語句實(shí)現(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進(jìn)行分組,因?yàn)槊恳粋€(gè)userid對(duì)應(yīng)的
subject="語文"的記錄只有一條,所以SUM() 的值就等于對(duì)應(yīng)那一條記錄的score的值。假如userid ='001' and subject='語文' 的記錄有兩條,則此時(shí)SUM() 的值將會(huì)是這兩條記錄的和,同理,使用Max()的值將會(huì)是這兩條記錄里面值最大的一個(gè)。但是正常情況下,一個(gè)user對(duì)應(yīng)一個(gè)subject只有一個(gè)分?jǐn)?shù),因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函數(shù)都可以達(dá)到行轉(zhuǎn)列的效果。

2. 使用 IF() 函數(shù)實(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) 作為條件,即對(duì)所有subject='語文’的記錄的score字段進(jìn)行SUM()、MAX()、MIN()、AVG()操作,如果score沒有值則默認(rèn)為0。

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

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

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

按照這一思路,給出SQL實(shí)現(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é)果當(dāng)然是預(yù)期的長表。這里重點(diǎn)解釋其中的三個(gè)細(xì)節(jié):

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

這實(shí)際上對(duì)應(yīng)的一個(gè)知識(shí)點(diǎn)是:在SQL中字符串的引用用單引號(hào)(其實(shí)雙引號(hào)也可以),而列字段名稱的引用則是用反引號(hào).

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

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

總結(jié)

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

相關(guān)文章

  • mysql數(shù)據(jù)庫腳本如何為表添加字段并設(shè)置備注

    mysql數(shù)據(jù)庫腳本如何為表添加字段并設(shè)置備注

    這篇文章主要介紹了mysql數(shù)據(jù)庫腳本如何為表添加字段并設(shè)置備注方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 解決MySQL 5.7中定位DDL被阻塞的問題

    解決MySQL 5.7中定位DDL被阻塞的問題

    這篇文章主要介紹了MySQL 5.7中如何定位DDL被阻塞的問題,在MySQL 5.7中,針對(duì)MDL,引入了一張新表performance_schema.metadata_locks,該表可對(duì)外展示MDL的相關(guān)信息,包括其作用對(duì)象,類型及持有等待情況。對(duì)此問題感興趣的朋友參考下本文
    2018-08-08
  • 分析MySQL中優(yōu)化distinct的技巧

    分析MySQL中優(yōu)化distinct的技巧

    這篇文章主要介紹了分析MySQL中優(yōu)化distinct的技巧,主要是通過減少本地掃描的次數(shù)來進(jìn)行優(yōu)化的方法,需要的朋友可以參考下
    2015-05-05
  • 輕松掌握MySQL函數(shù)中的last_insert_id()

    輕松掌握MySQL函數(shù)中的last_insert_id()

    相信大家應(yīng)該都知道Mysql函數(shù)可以實(shí)現(xiàn)許多我們需要的功能,這篇文章介紹的Mysql函數(shù)Last_insert_id()就是其中之一,文章通過一個(gè)例子展開來講,應(yīng)該更有助于大家的理解和學(xué)習(xí),有需要的朋友們下面來一起看看吧。
    2016-12-12
  • 優(yōu)化mysql的limit offset的例子

    優(yōu)化mysql的limit offset的例子

    在mysql中,通常使用limit做分頁,而且經(jīng)常會(huì)跟order by 連用。在order by 上加索引有時(shí)候是很有幫助的,不然系統(tǒng)會(huì)做很多的filesort
    2013-02-02
  • Nacos配置MySQL8的方法

    Nacos配置MySQL8的方法

    這篇文章主要介紹了Nacos配置MySQL8的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Debian 6.02 (squeeze)下編譯安裝 MySQL 5.5的方法

    Debian 6.02 (squeeze)下編譯安裝 MySQL 5.5的方法

    Debian 6.02 (squeeze)下編譯安裝 MySQL 5.5的方法,需要的朋友可以參考下。
    2011-12-12
  • MySQL PHP 語法詳解及實(shí)例代碼

    MySQL PHP 語法詳解及實(shí)例代碼

    這篇文章主要介紹了MySQL PHP 語法詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • MySQL數(shù)據(jù)庫重命名的快速且安全方法(3種)

    MySQL數(shù)據(jù)庫重命名的快速且安全方法(3種)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫重命名的快速且安全方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 你可能有所不知的MySQL正則表達(dá)式總結(jié)

    你可能有所不知的MySQL正則表達(dá)式總結(jié)

    使用正則表達(dá)式可以檢索或替換符合某個(gè)模式的文本內(nèi)容,根據(jù)指定的匹配模式匹配文本中符合要求的特殊字符串,下面這篇文章主要給大家介紹了關(guān)于MySQL正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評(píng)論