成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

MySQL中列轉行和行轉列總結解決思路

瀏覽:198日期:2023-02-18 16:43:20
目錄
  • 引言
  • 列轉行
  • 行轉列
  • 總結

引言

在學習sql中遇到了列轉行和行轉列的題目,這里總結一下如何在對應的情景下解決不同的題目;

列轉行

創建一個表stu_score_01:

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for stu_score_01-- ----------------------------DROP TABLE IF EXISTS `stu_score_01`;CREATE TABLE `stu_score_01` (  `id` varchar(255) NOT NULL,  `name` varchar(255) NOT NULL,  `chinese` varchar(255) DEFAULT NULL,  `math` varchar(255) DEFAULT NULL,  `english` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of stu_score_01-- ----------------------------BEGIN;INSERT INTO `stu_score_01` VALUES ("1", "張三", "111", "109", "98");INSERT INTO `stu_score_01` VALUES ("2", "李四", "89", "119", "109");INSERT INTO `stu_score_01` VALUES ("3", "王五", "96", "102", "107");INSERT INTO `stu_score_01` VALUES ("4", "小六", "56", "78", "88");COMMIT;SET FOREIGN_KEY_CHECKS = 1;

如果想要把這個表轉為下面的形式:

+--------+---------+-------+
| name | project | score |
+--------+---------+-------+
| 張三 | chinese | 111 |
| 李四 | chinese | 89 |
| 王五 | chinese | 96 |
| 小六 | chinese | 56 |
| 張三 | math | 109 |
| 李四 | math | 119 |
| 王五 | math | 102 |
| 小六 | math | 78 |
| 張三 | english | 98 |
| 李四 | english | 109 |
| 王五 | english | 107 |
| 小六 | english | 88 |
+--------+---------+-------+

那么就可以使用union或者union all來實現列轉行操作:

select name, "chinese" as project, chinese as score from stu_score_01union allselect name, "math" as project, math as score from stu_score_01union allselect name, "english" as project, english as score from stu_score_01;

簡單解釋一下:分別查詢每一個科目的所有情況,求并集即可;比如單獨執行一下sql:

select name, "chinese" as project, chinese as score from stu_score_01;#結果+--------+---------+-------+| name   | project | score |+--------+---------+-------+| 張三 	| chinese | 111   || 李四 	| chinese | 89    || 王五 	| chinese | 96    || 小六 	| chinese | 56    |+--------+---------+-------+

接下來只需要一次類推求出所有情況集合求并即可;

union和union all都是求的表的并集,但是union會有去重和排序操作,效率低于union all,這里不需要去重,所以使用union all保證效率;

行轉列

創建一個表stu_score_03:

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for stu_score_03-- ----------------------------DROP TABLE IF EXISTS `stu_score_03`;CREATE TABLE `stu_score_03` (  `id` varchar(255) NOT NULL,  `name` varchar(255) NOT NULL,  `project` varchar(255) DEFAULT NULL,  `score` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of stu_score_03-- ----------------------------BEGIN;INSERT INTO `stu_score_03` VALUES ("1", "張三", "chinese", "111");INSERT INTO `stu_score_03` VALUES ("10", "李四", "english", "109");INSERT INTO `stu_score_03` VALUES ("11", "王五", "english", "107");INSERT INTO `stu_score_03` VALUES ("12", "小六", "english", "88");INSERT INTO `stu_score_03` VALUES ("2", "李四", "chinese", "89");INSERT INTO `stu_score_03` VALUES ("3", "王五", "chinese", "96");INSERT INTO `stu_score_03` VALUES ("4", "小六", "chinese", "56");INSERT INTO `stu_score_03` VALUES ("5", "張三", "math", "109");INSERT INTO `stu_score_03` VALUES ("6", "李四", "math", "119");INSERT INTO `stu_score_03` VALUES ("7", "王五", "math", "102");INSERT INTO `stu_score_03` VALUES ("8", "小六", "math", "78");INSERT INTO `stu_score_03` VALUES ("9", "張三", "english", "98");COMMIT;SET FOREIGN_KEY_CHECKS = 1;

如果想要單獨把每一行科目分別轉化為不同的列,如:

+--------+---------+------+---------+| name   | chinese | math | english |+--------+---------+------+---------+| 小六 	| 56      | 78   | 88      || 張三 	| 111     | 109  | 98      || 李四 	| 89      | 119  | 109     || 王五 	| 96      | 102  | 107     |+--------+---------+------+---------+

可以使用case…when和max/sum和group by來實現:

select name,max(case when project = "chinese" then score else 0 end) as "chinese",max(case when project = "math" then score else 0 end) as "math",max(case when project = "english" then score else 0 end) as "english"from stu_score_03group by name;# 或者使用sumselect name,sum(case when project = "chinese" then score else 0 end) as "chinese",sum(case when project = "math" then score else 0 end) as "math",sum(case when project = "english" then score else 0 end) as "english"from stu_score_03group by name;

簡單解釋一下:

因為要查詢每個人的不同科目成績,所以需要對不同的人進行分組,所以需要使用group by,不然查出來的成績誰都不知道知道是誰的;

對于每一個case when,比如:case when project = 'chinese' then score else 0 end

意思就是當project為chinese時獲取score,否則就取0;其他也是一樣的意思

還有為什么需要加上max或者sum,先想象一下如果不加上max或者sum會有什么樣的效果:

因為先判斷的是chinese科目,如果張三首先出現的科目是math,那么他先走chinese科目的判斷,因為math不等于chinese,

所以給chinese科目賦值為0;

所以會看到如下效果:

select name,case when project = "chinese" then score else 0 end as "chinese",case when project = "math" then score else 0 end as "math",case when project = "english" then score else 0 end as "english"from stu_score_03group by name;#執行結果+--------+---------+------+---------+| name   | chinese | math | english |+--------+---------+------+---------+| 小六 	| 0       | 0    | 88      || 張三 	| 111     | 0    | 0       || 李四 	| 0       | 0    | 109     || 王五 	| 0       | 0    | 107     |+--------+---------+------+---------+

因為小六最先出現的是english成績,所以他的chinese和math成績都被賦予值為0,

而張三最先出現的是chinese成績,所以他的math和english成績也被賦予值為0;

如果使用max或者sum,那么max會在出現的所有值的情況下(包括0)去最大的值,其實就是實際的分數,只是把0的情況去除了;

而sum是加上了所有值,因為除了實際分數外其他都是0,所以可以直接相加;

總結

說了這么多,其實可以總結兩句話:

列轉行,查詢需要的每列數據使用union或者union all求并集

行轉列,使用case…when分情況查詢數據,group by和sum/max進行篩選

到此這篇關于MySQL中列轉行和行轉列總結解決思路的文章就介紹到這了,更多相關MySQL列轉行和行轉列內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MySQL
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
一区二区三区高清视频在线观看| 亚洲午夜激情av| 一区二区三区四区在线免费观看| 欧美在线免费一级片| 欧美日韩精品一区二区天天拍小说 | 亚洲欧美日韩久久精品| 欧美日本国产精品| 国产亚洲精品超碰| 91丨九色丨尤物| 久久久久99精品国产片| 91丨国产丨九色丨pron| 久久免费偷拍视频| 欧美在线亚洲综合一区| 国产偷国产偷精品高清尤物 | 午夜精品一区在线观看| 国产精品日韩一区二区| 亚洲综合在线第一页| 亚洲欧美bt| 日韩一区精品视频| 欧洲亚洲精品在线| 麻豆91在线观看| 欧美精品乱码久久久久久按摩| 国产精品一区二区x88av| 91精品国产aⅴ一区二区| 成人免费观看视频| 国产欧美一区二区三区在线老狼| 合欧美一区二区三区| 最新国产成人在线观看| 亚洲麻豆av| 亚洲国产中文字幕在线视频综合 | 香蕉久久夜色精品| 亚洲成人免费av| 91国产视频在线观看| 久久精品国产色蜜蜜麻豆| 7777精品伊人久久久大香线蕉完整版| 国产精品99久久久久久宅男| 欧美成人三级在线| 欧美日韩免费精品| 一区二区日韩电影| 91官网在线免费观看| 国产伦精品一区二区三区在线观看| 欧美一区二区三区在线视频| 91网站在线观看视频| 亚洲欧美国产77777| 老司机午夜免费精品视频 | 国产精品v欧美精品v日韩 | 99久久国产综合精品女不卡| 午夜精品久久久久久| 国产精品亚洲产品| 日韩精品三区四区| 欧美日韩在线不卡| 99re这里只有精品首页| 国产精品久久久久影院老司 | 精品美女被调教视频大全网站| 91色在线porny| 亚洲欧洲美洲综合色网| 久久一区激情| 国内不卡的二区三区中文字幕| 精品国产91洋老外米糕| 亚洲精品1区2区| 亚洲人123区| 亚洲香蕉网站| 一区二区三区国产精华| 在线视频一区二区三| 粉嫩一区二区三区在线看| 国产欧美一区二区在线| 国产乱人伦精品一区二区| 国内久久精品视频| 欧美国产欧美综合| 久久一区中文字幕| 成人综合婷婷国产精品久久| 亚洲欧美在线aaa| 久久久久久穴| 成人av免费观看| 一区二区不卡在线播放| 5月丁香婷婷综合| 亚洲一级网站| 精品在线一区二区| 欧美激情中文字幕一区二区| 一本色道a无线码一区v| 99精品在线免费| 亚洲电影一区二区| 日韩精品综合一本久道在线视频| 一本色道久久综合亚洲精品高清 | 色综合天天做天天爱| 亚洲国产精品久久久男人的天堂 | 亚洲一区二区欧美| 欧美一区二区精美| 在线视频精品一区| 国产99久久久国产精品潘金| 亚洲乱码国产乱码精品精的特点| 8v天堂国产在线一区二区| 亚洲动漫精品| 国产伦精品一区二区三区视频青涩 | 最新亚洲激情| 激情图片小说一区| 中文字幕在线不卡一区二区三区| 欧美日韩在线观看一区二区 | 欧美剧在线免费观看网站| 亚洲国产mv| 国产成人综合视频| 亚洲一区二区三区四区五区中文| 精品伦理精品一区| 日本久久精品电影| 一区二区视频欧美| 国产91在线|亚洲| 午夜精品福利视频网站| 中文字幕国产一区| 正在播放亚洲一区| 久久国产福利| 欧美激情一级片一区二区| 紧缚捆绑精品一区二区| 一区二区激情视频| 2022国产精品视频| 欧美日韩精品是欧美日韩精品| 一区二区精品在线观看| 成人精品视频网站| 狂野欧美性猛交blacked| 亚洲蜜臀av乱码久久精品蜜桃| 精品国产乱码久久久久久影片| 91黄色在线观看| 日韩亚洲国产欧美| 91丨porny丨最新| 韩国一区二区三区| 五月激情六月综合| 亚洲天堂网中文字| www激情久久| 在线观看91av| 久久综合一区| 一区二区三区福利| 欧美激情综合| av在线不卡观看免费观看| 亚洲第一综合色| 久久久777| 欧美不卡在线| 国产美女精品人人做人人爽| 一区二区三区日本| 国产欧美日韩激情| 日韩欧美国产小视频| 欧美日韩久久久久久| 亚洲一区网站| 伊人成年综合电影网| 99精品欧美一区二区三区小说| 美腿丝袜亚洲色图| 亚洲国产视频一区| 1区2区3区精品视频| 久久精品综合网| 日韩欧美国产综合| 在线电影院国产精品| 欧美专区一区二区三区| 亚洲美女少妇无套啪啪呻吟| 欧美精品二区三区四区免费看视频| 粉嫩aⅴ一区二区三区四区五区| 久久精工是国产品牌吗| 视频一区二区三区中文字幕| 亚洲精品久久嫩草网站秘色| 国产精品久久久久影院| 国产欧美日韩久久| 久久九九久久九九| 日韩一区二区三区视频在线观看| 欧美久久免费观看| 欧美日韩电影在线| 欧美日韩国产高清一区| 国产.精品.日韩.另类.中文.在线.播放| 精品久久久久久无| 欧美三电影在线| 欧美在线观看视频在线| 一本久久a久久免费精品不卡| 国产精品久久久一区二区| 一区在线视频观看| 精品不卡一区| 黄色亚洲精品| 国内精品美女在线观看| 欧美精品观看| 91蝌蚪porny九色| 成人avav影音| 99re这里只有精品首页| 91在线视频官网| 91丨九色丨尤物| 午夜久久资源| 欧美日韩亚洲免费| 欧美三级乱码| 亚洲高清电影| 国产欧美激情| 美女久久一区| 欧美在线小视频| 欧美高清一级片在线| 欧美一级午夜免费电影| 精品久久人人做人人爽| 欧美成人video| 久久久精品人体av艺术| 中文字幕欧美三区| 亚洲欧洲日产国码二区| 夜夜嗨av一区二区三区| 日韩av午夜在线观看| 九九精品视频在线看| 成人永久免费视频| 欧美日本国产精品| 中日韩在线视频| 色婷婷av一区二区三区之一色屋|