天天看點

SQL踩坑:計算函數or聚合函數的字段平級,導緻分辨不出彼此的别名問題

錯誤案例:

-- 統計學校表school中性别字段student_sex(student_sex取值為girl或者boy)的女生總人數
SUM(student_sex = "girl") AS "女學生總數";  -- 這裡會報錯,SUM函數的參數不正确
      

解決方式:

-- 統計學校表school中性别字段student_sex(student_sex取值為girl或者boy)的女生總人數
SUM(student_sex = "girl") AS "女學生總數";  -- 這裡會報錯,SUM函數的參數不正确
      

問題2:計算函數or聚合函數的字段平級,導緻分辨不出彼此的别名問題

SELECT
    COUNT(*) AS total, -- 學校的學生總數
    SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 計算女生總數
    SUM(CASE WHEN student_sex = 'boy' THEN 1 ELSE 0 END) AS boys, -- 計算男生總數
    (sch.boys / stu.total) AS "學校中男生所占的比例"
FROM 
    school sch -- 從學校表中查詢
GROUP BY
    student_grade; -- 按照年級分組 
      

如果使用這種方式去查詢,會出現如下報錯問題:

Semantic analysis exception - column stu.boys cannot be resolved
      

錯誤原因是

stu.boys

字段不能被解析,

SUM()

函數計算出school表中所有男生的總數,并為其其别名為

boys

注意:這裡的别名和表的别名

sch

是同級别的,是以不可以使用

sch.boys

的方式去獲得學校男生的總數量!

解決方案:

兩層SELECT嵌套查詢

SELECT 
    S.total AS "學生總數",
    S.boys AS "男生總數",
    S.girls AS "女生總數",
    (S.boys / S.total) AS "學校中男生所占的比例"
FROM 
    (
    SELECT
        COUNT(*) AS total,
        SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 計算女生總數
        SUM(CASE WHEN student_sex = 'boy' THEN 1 ELSE 0 END) AS boys, -- 計算男生總數
    FROM 
        school sch -- 從學校表中查詢,表别名為sch
    GROUP BY
        student_grade; -- 按照年級分組 
    ) S;
      

這樣就可以正常查詢啦!