91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL行轉列的方法是什么

發布時間:2022-01-11 15:18:39 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

本篇內容介紹了“MySQL行轉列的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

首先,我們看一下咱們的測試表數據和預期查詢的結果:

mysql> SELECT * FROM t_gaokao_score;
+----+--------------+--------------+-------+
| id | student_name | subject      | score |
+----+--------------+--------------+-------+
|  1 | 林磊兒       | 語文         |   148 |
|  2 | 林磊兒       | 數學         |   150 |
|  3 | 林磊兒       | 英語         |   147 |
|  4 | 喬英子       | 語文         |   121 |
|  5 | 喬英子       | 數學         |   106 |
|  6 | 喬英子       | 英語         |   146 |
|  7 | 方一凡       | 語文         |    70 |
|  8 | 方一凡       | 數學         |    90 |
|  9 | 方一凡       | 英語         |    59 |
| 10 | 方一凡       | 特長加分     |   200 |
| 11 | 陳哈哈       | 語文         |   109 |
| 12 | 陳哈哈       | 數學         |    92 |
| 13 | 陳哈哈       | 英語         |    80 |
+----+--------------+--------------+-------+
13 rows in set (0.00 sec)

看看我們行轉列轉完后的結果:

+--------------+--------+--------+--------+--------------+
| student_name | 語文   | 數學   | 英語   | 特長加分     |
+--------------+--------+--------+--------+--------------+
| 林磊兒       |    148 |    150 |    147 |            0 |
| 喬英子       |    121 |    106 |    146 |            0 |
| 方一凡       |     70 |     90 |     59 |          200 |
| 陳哈哈       |    109 |     92 |     80 |            0 |
+--------------+--------+--------+--------+--------------+
4 rows in set (0.00 sec)

好,下面我們一起來看看SQL是如何編寫的

一、行轉列SQL寫法

方法一、使用case..when..then進行 行轉列

ELECT student_name,
    SUM(CASE `subject` WHEN '語文' THEN score ELSE 0 END) as '語文',
    SUM(CASE `subject` WHEN '數學' THEN score ELSE 0 END) as '數學',
    SUM(CASE `subject` WHEN '英語' THEN score ELSE 0 END) as '英語',
    SUM(CASE `subject` WHEN '特長加分' THEN score ELSE 0 END) as '特長加分' 
FROM t_gaokao_score 
GROUP BY student_name;

這里如果不使用SUM()會報sql_mode=only_full_group_by相關錯誤,需要聚合函數和group by連用或使用distinct才可以解決。

  其實,加了SUM()是為了能夠使用GROUP BY根據student_name進行分組,每一個student_name對應的subject="語文"的記錄畢竟只有一條,所以SUM() 的值就等于對應那一條記錄的score的值。當然,也可以換成MAX()。

方法二、使用IF()進行 行轉列:

ELECT student_name,
    SUM(IF(`subject`='語文',score,0)) as '語文',
    SUM(IF(`subject`='數學',score,0)) as '數學',
    SUM(IF(`subject`='英語',score,0)) as '英語',
    SUM(IF(`subject`='特長加分',score,0)) as '特長加分' 
FROM t_gaokao_score 
GROUP BY student_name;

該方法將IF(subject='語文',score,0)作為條件,通過student_name進行分組,對分組后所有subject='語文’的記錄的score字段進行SUM()操作,如果score沒有值則默認為0。

這種方式和case..when..then方法原理相同,相比更加簡潔明了,建議使用。

二、如果領導@你,讓你在結果集中加上總數列呢?

友情提示:我們工作中處理行轉列數據時,盡量都把總數、平均數等加上,方便領導查閱,省得他循環BB你。

話說,你還記得上學時的成績表是啥樣的么?你一般從上往下看還是從下往上看呢?文末投票,快來給大家樂呵樂呵!

寫法:利用SUM(IF()) 生成列,WITH ROLLUP 生成匯總列和行,并利用 IFNULL將匯總行標題顯示為總數

SELECT IFNULL(student_name,'總數') AS student_name,
    SUM(IF(`subject`='語文',score,0)) AS '語文',
    SUM(IF(`subject`='數學',score,0)) AS '數學',
    SUM(IF(`subject`='英語',score,0)) AS '英語',
    SUM(IF(`subject`='特長加分',score,0)) AS '特長加分',
    SUM(score) AS '總數' 
FROM t_gaokao_score
GROUP BY student_name WITH ROLLUP;

查詢結果:

+--------------+--------+--------+--------+--------------+--------+
| student_name | 語文   | 數學   | 英語   | 特長加分     | 總數   |
+--------------+--------+--------+--------+--------------+--------+
| 喬英子       |    121 |    106 |    146 |            0 |    373 |
| 方一凡       |     70 |     90 |     59 |          200 |    419 |
| 林磊兒       |    148 |    150 |    147 |            0 |    445 |
| 陳哈哈       |    113 |    116 |     80 |            0 |    309 |
| 總數         |    452 |    462 |    432 |          200 |   1546 |
+--------------+--------+--------+--------+--------------+--------+
5 rows in set, 1 warning (0.00 sec)

三、領導又雙叒叕@你改需求

讓你把分值轉化為具體內容顯示(優秀、良好、普通、差),430分以上重點大學,400分以上一本,350分及以上二本,350以下搬磚,該怎么寫呢?

  這里我們就需要case when嵌套一下了,看著高大上,其實就是普通的嵌套而已。在第一層查出分組后的各科分數,在第二層替換成等級即可。

SELECT student_name,
MAX(  
        CASE subject  
        WHEN '語文' THEN  
            (  
                CASE  
                WHEN score - (select avg(score) from t_gaokao_score where subject='語文') > 20 THEN  
                    '優秀'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='語文') > 10 THEN  
                    '良好'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='語文') >= 0 THEN  
                    '普通'  
                ELSE  
                    '差'  
                END  
            )  
        END  
    ) as '語文', 
MAX(  
        CASE subject  
        WHEN '數學' THEN  
            (  
                CASE  
                WHEN score - (select avg(score) from t_gaokao_score where subject='數學') > 20 THEN  
                    '優秀'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='數學') > 10 THEN  
                    '良好'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='數學') >= 0 THEN  
                    '普通'  
                ELSE  
                    '差'  
                END  
            )  
        END  
    ) as '數學',
MAX(  
        CASE subject  
        WHEN '英語' THEN  
            (  
                CASE  
                WHEN score - (select avg(score) from t_gaokao_score where subject='英語') > 20 THEN  
                    '優秀'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='英語') > 10 THEN  
                    '良好'  
                WHEN score - (select avg(score) from t_gaokao_score where subject='英語') >= 0 THEN  
                    '普通'  
                ELSE  
                    '差'  
                END  
            )  
        END  
    ) as '英語',
SUM(score) as '總分',
(CASE WHEN SUM(score) > 430 THEN '重點大學'  
      WHEN SUM(score) > 400 THEN '一本'  
      WHEN SUM(score) > 350 THEN '二本'  
      ELSE '工地搬磚' 
      END ) as '結果'
FROM t_gaokao_score 
GROUP BY student_name 
ORDER BY SUM(score) desc;

我們來看一下輸出結果:

+--------------+--------+--------+--------+--------+--------------+
| student_name | 語文   | 數學   | 英語   | 總分   | 結果         |
+--------------+--------+--------+--------+--------+--------------+
| 林磊兒       | 優秀   | 優秀   | 優秀   |    445 | 重點大學     |
| 方一凡       | 差     | 差     | 差     |    419 | 一本         |
| 喬英子       | 普通   | 差     | 優秀   |    373 | 二本         |
| 陳哈哈       | 普通   | 普通   | 差     |    309 | 工地搬磚     |
+--------------+--------+--------+--------+--------+--------------+
4 rows in set (0.00 sec)

過來人的經驗來看,老實孩子最吃虧,早知道他娘的走藝體了~

附錄:創建表結構&測試數據SQL

表結構:

DROP TABLE IF EXISTS `t_gaokao_score`;
CREATE TABLE `t_gaokao_score`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `student_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '學生姓名',
  `subject` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '科目',
  `score` double NULL DEFAULT NULL COMMENT '成績',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

導入測試數據:

INSERT INTO `t_gaokao_score` VALUES 
(1, '林磊兒', '語文', 148),
(2, '林磊兒', '數學', 150),
(3, '林磊兒', '英語', 147),
(4, '喬英子', '語文', 121),
(5, '喬英子', '數學', 106),
(6, '喬英子', '英語', 146),
(7, '方一凡', '語文', 70),
(8, '方一凡', '數學', 90),
(9, '方一凡', '英語', 59),
(10, '方一凡', '特長加分', 200),
(11, '陳哈哈', '語文', 109),
(12, '陳哈哈', '數學', 92),
(13, '陳哈哈', '英語', 80);

“MySQL行轉列的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥宁县| 山阴县| 福州市| 东乌珠穆沁旗| 财经| 那曲县| 舞钢市| 襄汾县| 平江县| 昌宁县| 容城县| 赣榆县| 共和县| 遵化市| 明光市| 铜鼓县| 兴仁县| 平凉市| 丹凤县| 怀柔区| 桃园市| 新竹县| 防城港市| 理塘县| 德保县| 布拖县| 佛山市| 京山县| 威海市| 勃利县| 滦平县| 易门县| 本溪市| 格尔木市| 合江县| 东台市| 邻水| 北票市| 桃江县| 礼泉县| 长阳|