简体   繁体   English

SQL平均年龄比较函数返回null

[英]SQL average age comparison function returns null

So, I'm working in MySQL, writing a function that averages the ages of women and men from a table and compares them, and returns which is greater. 因此,我在MySQL中工作,编写了一个函数,该函数可以对表中男女的年龄进行平均并进行比较,然后得出更大的结果。 Dates are in the format of YYYY-MM-DD, and I'm using DATEDIFF(). 日期的格式为YYYY-MM-DD,我正在使用DATEDIFF()。 The function appears to work correctly, but when I run the script, all I get is a message box with a null value instead of the response it should output. 该函数似乎正常工作,但是当我运行脚本时,得到的只是一个带有空值的消息框,而不是应该输出的响应。

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();

Can someone spot where I'm messing up? 有人可以发现我在搞砸吗?

Edit 编辑

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();

So, this is what I did that works. 因此,这就是我所做的工作。

While you declared the variable averMen, you have not initialized it. 在声明变量averMen时,尚未初始化它。 The query which should be calculating averMen is calculating averWomen instead. 应该计算averMen的查询正在计算averWomen。

Try changing ... 尝试改变...

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

into 进入

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

Your query is way too complicated. 您的查询是复杂。 Why not just use conditional aggregation? 为什么不只使用条件聚合呢?

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

Why use five queries when you can just use one? 为什么只使用一个查询就使用五个查询?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM