mysql 行轉列與列傳行
一、行轉列— case+group by
mysql> CREATE TABLE `TEST_TB_GRADE` ( -> `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;
插入數據:
mysql> insert into TEST_TB_GRADE(USER_NAME, COURSE, SCORE) values -> ("張三", "數學", 34), -> ("張三", "語文", 58), -> ("張三", "英語", 58), -> ("李四", "數學", 45), -> ("李四", "語文", 87), -> ("李四", "英語", 45), -> ("王五", "數學", 76), -> ("王五", "語文", 34), -> ("王五", "英語", 89);
查詢表:
mysql> select * from test_tb_grade; +----+-----------+--------+-------+ | ID | USER_NAME | COURSE | SCORE | +----+-----------+--------+-------+ | 1 | 張三 | 數學 | 34 | | 2 | 張三 | 語文 | 58 | | 3 | 張三 | 英語 | 58 | | 4 | 李四 | 數學 | 45 | | 5 | 李四 | 語文 | 87 | | 6 | 李四 | 英語 | 45 | | 7 | 王五 | 數學 | 76 | | 8 | 王五 | 語文 | 34 | | 9 | 王五 | 英語 | 89 | +----+-----------+--------+-------+
不用聚集函數和group by語句:
mysql> 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_tb_grade; +-----------+--------+--------+--------+ | user_name | 數學 | 語文 | 英語 | +-----------+--------+--------+--------+ | 張三 | 34 | 0 | 0 | | 張三 | 0 | 58 | 0 | | 張三 | 0 | 0 | 58 | | 李四 | 45 | 0 | 0 | | 李四 | 0 | 87 | 0 | | 李四 | 0 | 0 | 45 | | 王五 | 76 | 0 | 0 | | 王五 | 0 | 34 | 0 | | 王五 | 0 | 0 | 89 | +-----------+--------+--------+--------+
用group by語句:
mysql> 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_tb_grade -> group by user_name; +-----------+--------+--------+--------+ | user_name | 數學 | 語文 | 英語 | +-----------+--------+--------+--------+ | 張三 | 34 | 0 | 0 | | 李四 | 45 | 0 | 0 | | 王五 | 76 | 0 | 0 | +-----------+--------+--------+--------+
用group by語句和聚集函數實現行轉列:
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_tb_grade -> group by user_name; +-----------+--------+--------+--------+ | user_name | 數學 | 語文 | 英語 | +-----------+--------+--------+--------+ | 張三 | 34 | 58 | 58 | | 李四 | 45 | 87 | 45 | | 王五 | 76 | 34 | 89 | +-----------+--------+--------+--------+
二、列轉行——union
CREATE TABLE `TEST_TB_GRADE2` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `CN_SCORE` float DEFAULT NULL, `MATH_SCORE` float DEFAULT NULL, `EN_SCORE` float DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
插入數據:
insert into TEST_TB_GRADE2(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values ("張三", 34, 58, 58), ("李四", 45, 87, 45), ("王五", 76, 34, 89);
查詢:
mysql> select * from test_tb_grade2; +----+-----------+----------+------------+----------+ | ID | USER_NAME | CN_SCORE | MATH_SCORE | EN_SCORE | +----+-----------+----------+------------+----------+ | 1 | 張三 | 34 | 58 | 58 | | 2 | 李四 | 45 | 87 | 45 | | 3 | 王五 | 76 | 34 | 89 | +----+-----------+----------+------------+----------+
不求並集:
mysql> select user_name, '語文' COURSE , CN_SCORE as SCORE from test_tb_grade2; +-----------+--------+-------+ | user_name | COURSE | SCORE | +-----------+--------+-------+ | 張三 | 語文 | 34 | | 李四 | 語文 | 45 | | 王五 | 語文 | 76 | +-----------+--------+-------+
求並集:
mysql> select user_name, '語文' COURSE , CN_SCORE as SCORE from test_tb_grade2 -> union select user_name, '數學' COURSE, MATH_SCORE as SCORE from test_tb_grade2 -> union select user_name, '英語' COURSE, EN_SCORE as SCORE from test_tb_grade2; +-----------+--------+-------+ | user_name | COURSE | SCORE | +-----------+--------+-------+ | 張三 | 語文 | 34 | | 李四 | 語文 | 45 | | 王五 | 語文 | 76 | | 張三 | 數學 | 58 | | 李四 | 數學 | 87 | | 王五 | 數學 | 34 | | 張三 | 英語 | 58 | | 李四 | 英語 | 45 | | 王五 | 英語 | 89 | +-----------+--------+-------+
order by語句:
mysql> select user_name, '語文' COURSE , CN_SCORE as SCORE from test_tb_grade2 -> union select user_name, '數學' COURSE, MATH_SCORE as SCORE from test_tb_grade2 -> union select user_name, '英語' COURSE, EN_SCORE as SCORE from test_tb_grade2 -> order by user_name,COURSE; +-----------+--------+-------+ | user_name | COURSE | SCORE | +-----------+--------+-------+ | 張三 | 數學 | 58 | | 張三 | 英語 | 58 | | 張三 | 語文 | 34 | | 李四 | 數學 | 87 | | 李四 | 英語 | 45 | | 李四 | 語文 | 45 | | 王五 | 數學 | 34 | | 王五 | 英語 | 89 | | 王五 | 語文 | 76 | +-----------+--------+-------+
到此這篇關於mysql 行轉列與列傳行的文章就介紹到這瞭,更多相關mysql 行轉列與列傳行內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!