mysql行轉列,列轉行,以及為什么行轉列的時候用max函數


行轉列首先我們先創建一個表

表如下
在這里插入圖片描述

CREATE TABLE test_hjsjy_1( `id` int(10) NOT NULL AUTO_INCREMENT, `user_name` varchar(20) DEFAULT NULL, `course` varchar(20) DEFAULT NULL, `score` float DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=INNODB auto_increment=1 DEFAULT CHARSET=utf8; 

給表賦值

INSERT INTO test_hjsjy_1(user_name,COURSE,score) VALUES ("老大","數學",56), ("老大","語文",35), ("老大","英語",87), ("老二","數學",36), ("老二","語文",78), ("老二","英語",52), ("老三","數學",72), ("老三","語文",91), ("老三","英語",59); 

行轉列mysql語句

SELECT user_name, MAX(CASE course WHEN '數學' THEN score ELSE 0 END) 數學, MAX(CASE course WHEN '語文' THEN score ELSE 0 END) 語文, MAX(CASE course WHEN '英語' THEN score ELSE 0 END) 英語 from test_hjsjy_1 GROUP BY user_name; 

效果如下
在這里插入圖片描述

這里大部分第一次學mysql 行轉列地時候看到這個語句會很奇怪為啥要用MAX函數呢? 這個不是多余地嗎?

解答: 這並不是多余地,其實我們來測試一下我不加max看是什么效果

SELECT user_name , (CASE course WHEN '數學' THEN score ELSE 0 END ) 數學, (CASE course WHEN '語文' THEN score ELSE 0 END ) 語文, (CASE course WHEN '英語' THEN score ELSE 0 END ) 英語 FROM test_hjsjy_1 GROUP BY user_name; 

看一下我們查詢的效果
在這里插入圖片描述
這里我們會發現我們老大老二老三的語文和英語成績怎么沒了都是0?
我們再嘗試看看把上面的查詢語句中group by user_name 試着去掉

SELECT user_name , (CASE course WHEN '數學' THEN score ELSE 0 END ) 數學, (CASE course WHEN '語文' THEN score ELSE 0 END ) 語文, (CASE course WHEN '英語' THEN score ELSE 0 END ) 英語 FROM test_hjsjy_1 

再看看查詢結果
在這里插入圖片描述
聰明的人的現在知道為啥需要用max函數了,其實是因為group by分組,你沒有max函數 他就會查詢每個分組的第一個元組,所以max函數是不能少的,這個問題也啟發我們,遇到這種問題我們可以通過調試sql,來解決我們遇到的疑惑。

列轉行舉例首先我們需要創建一個表

表如下
在這里插入圖片描述

CREATE TABLE `test_hjsjy_2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `user_name` varchar(20) DEFAULT NULL, `chinese_score` float DEFAULT NULL, `math_score` float DEFAULT NULL, `english_score` float DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

列轉行表賦值

insert into test_hjsjy_2(user_name, chinese_score, math_score, english_score) values ("老大", 34, 58, 58), ("老二", 45, 87, 45), ("老三", 76, 34, 89); 

列轉行mysql語句

select user_name, '語文' COURSE , chinese_score as SCORE from test_hjsjy_2 union select user_name, '數學' COURSE, math_score as SCORE from test_hjsjy_2 union select user_name, '英語' COURSE, english_score as SCORE from test_hjsjy_2 order by user_name,course; 

表結果如下
在這里插入圖片描述
這樣我們也就實現了列轉行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM