成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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| 国产精品久久久久aaaa樱花| 国产成人精品一区二区三区四区 | 91一区二区三区在线观看| 欧美美女bb生活片| 激情六月婷婷久久| 欧美三级一区二区| 久久精品免费观看| 欧美视频在线观看一区| 蜜桃av一区二区| 在线精品视频小说1| 日本女优在线视频一区二区| 六月丁香综合| 天天色天天爱天天射综合| 免费亚洲视频| 日韩精品一级中文字幕精品视频免费观看| 免费视频一区| 免费观看日韩电影| 欧美日本在线一区| 国产成人免费在线| 精品国产一区二区亚洲人成毛片 | 麻豆精品视频在线观看免费| 在线观看av一区| 国产在线不卡一区| 欧美va亚洲va香蕉在线| 成人国产免费视频| 国产欧美一区视频| 亚洲私人影院| 一区二区三区色| 亚洲综合好骚| 日本一不卡视频| 欧美色综合天天久久综合精品| 国模套图日韩精品一区二区| 欧美成人午夜电影| 国产综合欧美在线看| 亚洲欧美激情小说另类| 美女网站久久| 久草精品在线观看| 日韩一区二区视频| 欧美日韩另类丝袜其他| 亚洲色图.com| 玖玖玖国产精品| 国产麻豆精品久久一二三| 久久色在线观看| 狠狠综合久久| 亚洲aⅴ怡春院| 欧美色大人视频| 91在线精品秘密一区二区| 自拍偷拍国产精品| 久久综合中文| 成人高清免费观看| 专区另类欧美日韩| 久久精品国产99精品国产亚洲性色| 久久激情五月婷婷| 久久久天堂av| 99精品视频免费全部在线| 日本免费在线视频不卡一不卡二| 日韩欧美一区二区久久婷婷| 国产精品大全| 日本少妇一区二区| 精品盗摄一区二区三区| 亚洲作爱视频| 韩国v欧美v亚洲v日本v| 国产亚洲精品资源在线26u| 999在线观看精品免费不卡网站| 日韩一区精品视频| 日韩精品影音先锋| 亚洲精品123区| 激情都市一区二区| 国产精品午夜在线观看| 国产精品色婷婷久久58| 亚洲欧美日本视频在线观看| 国产黑丝在线一区二区三区| 亚洲视频1区2区| 欧美日韩在线不卡| 欧美日韩亚洲三区| 麻豆一区二区三区| 国产精品毛片大码女人| 色94色欧美sute亚洲13| 91年精品国产| 日韩专区在线视频| 久久久精品蜜桃| 久久久亚洲人| 91美女片黄在线观看| 午夜国产精品一区| 精品理论电影在线观看| 国产精品区二区三区日本| 国产成人免费视频网站| 亚洲免费大片在线观看| 欧美一级午夜免费电影| 国产精品日韩欧美一区二区| 成人福利电影精品一区二区在线观看 | 欧美欧美欧美欧美| 黄色av一区| 国产一区二区视频在线| 亚洲免费在线视频| 欧美一区二区免费观在线| 国产日韩欧美精品| av在线不卡免费看| 奇米四色…亚洲| 中文字幕精品在线不卡| 精品1区2区3区| 在线观看欧美一区| 丁香五精品蜜臀久久久久99网站| 亚洲成a人片综合在线| 久久亚洲综合av| 色婷婷激情久久| 激情婷婷久久| 成人午夜电影网站| 日韩在线卡一卡二| 亚洲三级理论片| 精品国产免费视频| 欧美主播一区二区三区| 在线免费日韩片| 成人免费va视频| 美女久久久精品| 日韩美女视频一区二区 | 亚洲国产精品嫩草影院| 国产清纯白嫩初高生在线观看91 | 中文字幕乱码日本亚洲一区二区| 欧美日韩亚洲高清一区二区| 一区二区国产精品| 91麻豆精东视频| 狠狠狠色丁香婷婷综合激情 | 久久精品人人做人人综合 | 日韩国产欧美视频| 亚洲天堂福利av| 久久一二三国产| 91精品国产福利在线观看| 一本久久精品一区二区| 99精品欧美一区二区三区| 欧美黄色aaaa| 国产盗摄一区二区三区| 五月激情六月综合| 亚洲欧美日韩电影| 欧美激情艳妇裸体舞| 日韩女优毛片在线| 欧美日韩的一区二区| 久久性天堂网| 亚洲一区精彩视频| 亚洲精品乱码| 亚洲欧美综合国产精品一区| 成人久久18免费网站麻豆| 久久国产精品99久久久久久老狼| 一区二区不卡在线视频 午夜欧美不卡在| 国产欧美日韩精品a在线观看| 欧美成人艳星乳罩| 欧美日韩免费在线视频| 一本大道久久精品懂色aⅴ| 国产欧美一级| 一区二区冒白浆视频| 欧美午夜在线| 欧美三级小说| 午夜精品免费| 奇米在线7777在线精品| 亚洲成a人片在线观看中文| 中文字幕中文在线不卡住| 久久久av毛片精品| 精品久久一二三区| 精品三级在线看| 欧美mv日韩mv国产网站app| 91麻豆精品91久久久久久清纯| 91福利小视频| 在线观看免费一区| 欧美色图12p| 欧美日韩一区视频| 欧美日韩视频在线第一区| 国产精品夜夜夜| 99pao成人国产永久免费视频| 激情av一区| 亚洲高清在线| 国产区日韩欧美| 麻豆精品视频| 久久综合图片| 欧美视频在线一区| 91精品视频网| 日韩精品综合一本久道在线视频| 69久久夜色精品国产69蝌蚪网| 欧美精品久久一区二区三区| 91精品中文字幕一区二区三区| 欧美一区二区三区喷汁尤物| 欧美一级欧美一级在线播放| 欧美v日韩v国产v| 久久久久久久久久电影| 久久美女艺术照精彩视频福利播放| 精品少妇一区二区三区视频免付费| 精品人在线二区三区| 久久久三级国产网站| 国产精品久久久久久户外露出| 亚洲欧美国产77777| 亚洲成人免费视| 蜜臀av在线播放一区二区三区| 久久精品国产99久久6| 国产精品1024| 99久久精品免费精品国产| 欧美日本亚洲韩国国产| 在线视频精品一区| 一本高清dvd不卡在线观看|