2015-06-14 156 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