2015-06-14 155 views
0

因此,我正在使用MySQL,編寫一個函數,用於平均表中的女性和男性的年齡並比較它們,並返回更大的結果。日期格式爲YYYY-MM-DD,我使用DATEDIFF()。該函數似乎正常工作,但是當我運行腳本時,我所得到的只是一個帶有空值的消息框,而不是它應該輸出的響應。SQL平均年齡比較函數返回null

USE tennis; 

DROP PROCEDURE IF EXISTS AverAge; 

DELIMITER // 

CREATE PROCEDURE AverAge() 
BEGIN 
    DECLARE averWomen DECIMAL(3,2); 
    DECLARE averMen DECIMAL(3,2); 

    SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE())) 
    INTO averWomen 
    FROM PLAYERS 
    WHERE sex = 'F'; 

    SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE())) 
    INTO averWomen 
    FROM PLAYERS 
    WHERE sex = 'M'; 

    IF averWomen > averMen THEN 
     SELECT CONCAT('The average age of women is higher. It is ', averWomen) AS message; 
    ELSEIF averMen > averWomen THEN 
     SELECT CONCAT('The average age of women is higher. It is ', averMen) AS message; 
    ELSE 
     SELECT CONCAT('The average age of men and women is equal. It is ', averWomen, ' for women and ', averMen, ' for men.') AS message; 
    END IF; 
END// 

DELIMITER ; 

CALL AverAge(); 

有人可以發現我搞亂了嗎?

編輯

USE tennis; 

DROP PROCEDURE IF EXISTS AverAge; 

DELIMITER // 

CREATE PROCEDURE AverAge() 
BEGIN 
    DECLARE averWomen DECIMAL(10,6); 
    DECLARE averMen DECIMAL(10,6); 

    SELECT AVG(EXTRACT(year FROM CURDATE()) - EXTRACT(YEAR FROM BIRTH_DATE)) 
    INTO averWomen 
    FROM PLAYERS 
    WHERE SEX = 'F'; 

    SELECT AVG(EXTRACT(year FROM CURDATE()) - EXTRACT(year FROM BIRTH_DATE)) 
    INTO averMen 
    FROM PLAYERS 
    WHERE SEX = 'M'; 

    IF averWomen > averMen THEN 
     SELECT CONCAT('The average age of women is higher. It is ', averWomen) AS message; 
    ELSEIF averMen > averWomen THEN 
     SELECT CONCAT('The average age of women is higher. It is ', averMen) AS message; 
    ELSE 
     SELECT CONCAT('The average age of men and women is equal. It is ', averWomen, ' for women and ', averMen, ' for men.') AS message; 
    END IF; 
END// 

DELIMITER ; 

CALL AverAge(); 

所以,這就是我所做的是作品。

回答

0

當您聲明變量averMen時,您尚未初始化它。應該計算averMen的查詢正在計算averWomen。

嘗試改變...

SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE())) 
INTO averWomen 
FROM PLAYERS 
WHERE sex = 'M'; 

SELECT AVG(DATEDIFF(BIRTH_DATE,CURDATE())) 
INTO averMen 
FROM PLAYERS 
WHERE sex = 'M'; 
+0

嘎,我不能相信我錯過了那個。現在我只是因爲某種原因搞亂了平均值......雖然現在我沒有得到預期的結果,但至少它似乎正在適當地運行。 – Pstanton

0

您的查詢方式太複雜了。爲什麼不使用條件聚合?

SELECT (CASE WHEN avg_f > avg_m 
      THEN CONCAT('The average age of women is higher. It is ', avf_f) 
      WHEN avg_m > avg_f 
      THEN CONCAT('The average age of men is higher. It is ', avg_m) 
      ELSE CONCAT('The average age of men and women is equal. It is ', avg_f, ' for both.') 
     END) AS message 
FROM (SELECT AVG(CASE WHEN sex = 'M' THEN DATEDIFF(BIRTH_DATE, CURDATE()) END) as avg_m, 
      AVG(CASE WHEN sex = 'F' THEN DATEDIFF(BIRTH_DATE, CURDATE()) END) as avg_f 
     FROM PLAYERS 
    ) a 

爲什麼在使用一個查詢時使用五個查詢?

+0

我只是在學習,但是,這將是更優雅的解決方案。 – Pstanton