Mysql之如何實現(xiàn)行列轉換
mysql數(shù)據(jù)庫如何實現(xiàn)行列轉換
1. 行轉列


方案一
select name, sum(case when course='java' then grade end) as java, sum(case when course='C++' then grade end) as C++, sum(case when course='C#' then grade end) as C# from test group by name
方案二
select distinct c.`name` AS name, (select grade from test where name = c.`name` and course = 'java' )as java, (select grade from test where name = c.`name` and course = 'C++' )as C++, (select grade from test where name = c.`name` and course = 'C#' )as C# from test c
結合項目用到的sql:
select MAIN_STATION_CODE_ as stationCode, case when SUBSTR(PLAN_START_DATE_, 1, 10)=curdate() then STATION_ else "" end as firstDay, case when SUBSTR(PLAN_START_DATE_, 1, 10)=DATE_SUB(curdate(),INTERVAL -1 DAY) then STATION_ else "" end as secondDay, case when SUBSTR(PLAN_START_DATE_, 1, 10)=DATE_SUB(curdate(),INTERVAL -2 DAY) then STATION_ else "" end as thirdDay, case when SUBSTR(PLAN_START_DATE_, 1, 10)=DATE_SUB(curdate(),INTERVAL -3 DAY) then STATION_ else "" end as fourthDay from ps_overhaul_plan_row group by MAIN_STATION_CODE_
方案二拓展
上面我們是采用逐個判斷并拼接的方式來進行,那如果極端情況下,假如有成百上千個值需要判斷怎么辦?
這種情況下,能夠立即想到的是采用函數(shù)來拼接出對應的語句塊,再合并在一起執(zhí)行。

假如我們需要拼接下面一句:
(select GRADE_ FROM grade where name_ = c.name_ and course_ = ‘Math') as Math,
使用concat函數(shù)(例子):
select c.name_,concat('(SELECT grade_ from grade where name_=c.name_ ', 'and course_ =''', c.course_, '''', ') as ',c.course_, ')') from grade c
然后再次使用group_concat函數(shù)將多行轉為一行:
SELECT GROUP_CONCAT(distinct concat('(SELECT grade_ from grade where name_=c.name_ ', 'and course_ =''', c.course_, '''', ') as ',c.course_, ')')) from grade c
最后再使用存儲過程完成動態(tài)sql執(zhí)行。
方案三:帶匯總
select ifnull(uid,'Total') uid, uname, sum(if(`course`='java',grade,0)) 'java', sum(if(`course`='C++',grade,0)) 'C++', sum(if(`course`='C#',grade,0)) 'C#', sum(score) 'total' from course group by uid with ROLLUP
方案四:使用group_concat函數(shù)
SELECT
id,
name,
group_concat(CASE WHEN subject = 'Math' THEN score END SEPARATOR '') '數(shù)學',
group_concat(CASE WHEN subject = 'English' THEN score END SEPARATOR '') '英語'
FROM test1
GROUP BY name;2. 列轉行
原表:

實現(xiàn)SQL:
SELECT d.name_,'Math' AS subject,d.Math_ AS score FROM grade_column d UNION ALL SELECT d.name_, 'English' as SUBJECT,d.English_ as score from grade_column d
列轉行效果如下:

說明:SELECT “hello” as subject from dual;作用是新添加列subject,并且列值為hello;

總結
行轉列原理:
CASE WHEN或IF,這兩種都是判斷條件,滿足條件的時候我們把它當做新的一列。
列轉行原理:
UNION或UNION ALL,這兩個都是把結果集合并起來,每次查詢學生名稱(基本列)和學科的其中一列的值,再把它們組合起來,這樣結果集就只有學生名稱和科目成績兩列了,這里多加了一列科目。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL MHA集群詳解(數(shù)據(jù)庫高可用)
MHA(MasterHighAvailability)是開源MySQL高可用管理工具,用于自動故障檢測與轉移,支持異步或半同步復制的MySQL主從架構,本文介紹MySQL MHA集群(數(shù)據(jù)庫高可用)的相關知識,感興趣的朋友跟隨小編一起看看吧2025-11-11
MySQL提取Json內(nèi)部字段轉儲為數(shù)字
本文主要介紹了MySQL提取Json內(nèi)部字段轉儲為數(shù)字,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題
這篇文章主要介紹了MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題 ,需要的朋友可以參考下2019-07-07
MySQL數(shù)據(jù)庫恢復(使用mysqlbinlog命令)
binlog是通過記錄二進制文件方式來備份數(shù)據(jù),然后在從二進制文件將數(shù)據(jù)恢復到某一時段或某一操作點。2011-08-08
Mysql 日期時間 DATE_FORMAT(date,format)
Mysql 日期時間 DATE_FORMAT(date,format) ,需要的朋友可以參考下。2010-12-12

