日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:263日期: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
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品88久久久久久| 在线日韩av| 一区二区精彩视频| 在线亚洲国产精品网站| 蜜桃视频欧美| 一区二区亚洲精品| 午夜久久福利| 午夜在线播放视频欧美| 狠狠干综合网| 日韩中文字幕1| 中文一区一区三区免费在线观 | 久久狠狠婷婷| 国产精品91一区二区三区| 一区久久精品| 中文字幕日韩亚洲| 欧美三区不卡| 国产九九精品| 国产一区二区三区天码| 日韩精品1区| 伊人精品一区| 视频在线观看国产精品| 一区二区三区网站| 91av一区| 久久只有精品| 日韩三区在线| 日韩亚洲精品在线| 热久久久久久久| 啪啪亚洲精品| 久久只有精品| 日韩精品一区二区三区免费观影| 亚洲黑丝一区二区| 久久性天堂网| 国产麻豆精品久久| 在线亚洲人成| 美女尤物久久精品| 国产日韩欧美一区在线| 日韩a一区二区| 欧美在线亚洲| 欧美亚洲三级| 久久精品在线| 午夜性色一区二区三区免费视频| 欧美视频久久| 日韩免费一区| 蜜乳av另类精品一区二区| 日本视频中文字幕一区二区三区| 精品久久国产一区| 亚洲成人三区| 国产乱论精品| 99久久亚洲精品蜜臀| 亚洲青青久久| 精品免费av一区二区三区| 亚洲二区免费| 国产一级成人av| 久久精品动漫| 欧美永久精品| 999国产精品| 一区二区高清| 涩涩av在线| 日韩在线观看一区二区三区| 国产96在线亚洲| 免费在线观看视频一区| 国产在线一区不卡| 男女男精品网站| 国产成人精品一区二区三区视频 | 久久精品在线| 奇米777国产一区国产二区| a国产在线视频| 蜜桃av一区二区| 蜜臀国产一区| 日韩精品国产精品| 91精品一区二区三区综合| 911亚洲精品| 美女久久久久| 麻豆91小视频| 亚洲丝袜美腿一区| 日产精品一区| 久久精品 人人爱| 悠悠资源网久久精品| 精品一区二区三区在线观看视频| 免费观看在线综合色| 波多视频一区| 欧美日韩午夜| 中文日韩在线| 88xx成人免费观看视频库| 国产日韩三级| 亚洲最新av| 久久久一二三| 久久精品二区亚洲w码| 婷婷精品在线观看| 亚洲香蕉网站| аⅴ资源天堂资源库在线| 久久国内精品视频| 亚洲影院天堂中文av色| 成年男女免费视频网站不卡| 欧美日韩伊人| 蜜桃一区二区三区在线| 99视频精品全国免费| 麻豆视频一区二区| 日韩国产欧美视频| 蜜桃视频第一区免费观看| 亚洲午夜视频| 性欧美videohd高精| 精品三级久久久| 国产精品亚洲欧美一级在线| 日本亚洲欧洲无免费码在线| 久久午夜影视| 国产精品日本| 不卡一区2区| 久久网站免费观看| 欧美成人a交片免费看| 久久香蕉精品香蕉| 国产欧美精品久久| 蜜臀av一区二区在线免费观看| 国产一在线精品一区在线观看| 91av亚洲| www.com.cn成人| 色欧美自拍视频| 激情综合五月| 国产一区二区三区亚洲| 精品成av人一区二区三区 | 亚洲日产国产精品| 丝袜脚交一区二区| 免费日韩av片| 蜜桃视频一区二区三区在线观看| 99在线精品视频在线观看| 999视频精品| 蜜桃精品在线| 欧美一区二区三区激情视频 | 欧美性感美女一区二区| 精品捆绑调教一区二区三区| 日韩欧美一区二区三区免费看| 精品成人18| 亚洲综合电影| 久久九九精品| 蜜臀av免费一区二区三区| 午夜久久99| 丝袜美腿亚洲一区二区图片| 国产精品日韩| 亚洲精品乱码久久久久久蜜桃麻豆| 99日韩精品| 亚洲伊人精品酒店| 欧美另类中文字幕| 麻豆精品在线观看| 色婷婷色综合| 亚洲婷婷免费| 蜜桃视频在线观看一区| 日韩激情啪啪| 国产伦精品一区二区三区视频| 国产精品极品国产中出| 久久av免费| 国产成人1区| 亚洲一级网站| 玖玖精品视频| 日韩欧美中文字幕在线视频| 影音先锋久久精品| 国产亚洲一卡2卡3卡4卡新区| 国产极品模特精品一二| 另类欧美日韩国产在线| 国产一区二区三区久久| 日韩免费在线| 久久午夜精品一区二区| 日本精品久久| 欧美激情国产在线| 999国产精品永久免费视频app| 欧美日韩国产免费观看视频| 视频一区中文字幕| 日韩av网站在线免费观看| 国产精品a久久久久| 成人在线超碰| 丝袜av一区| 亚洲一区二区三区中文字幕在线观看 | 丁香婷婷久久| 久久在线免费| 亚洲视频国产精品| 久久av导航| 久久五月天小说| 四虎国产精品免费久久| 精品网站aaa| 久久一区二区中文字幕| 亚洲日本久久| 精品久久99| 久久中文视频| 日韩avvvv在线播放| 岛国av在线网站| 久久午夜视频| 麻豆成人91精品二区三区| 欧美一区二区三区高清视频| 日韩精彩视频在线观看| 免费福利视频一区二区三区| 久久福利毛片| 国产精品传媒麻豆hd| 久久久久久美女精品| 婷婷亚洲成人| 亚洲不卡系列| 三级久久三级久久久| 欧美xxxx中国| 男女性色大片免费观看一区二区 | 亚洲乱码久久| 欧美国产一级| 亚洲+小说+欧美+激情+另类|