SQL 平均年龄比较函数 returns null
SQL average age comparison function returns null
所以,我在 MySQL 工作,编写了一个函数,计算 table 中女性和男性年龄的平均值并进行比较,returns 哪个更大。日期的格式为 YYYY-MM-DD,我使用的是 DATEDIFF()。该函数似乎可以正常工作,但是当我 运行 脚本时,我得到的只是一个带有空值的消息框,而不是它应该输出的响应。
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();
所以,这就是我所做的工作。
虽然你声明了变量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';
您的查询方式太复杂了。为什么不直接使用条件聚合?
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
为什么只能使用一个查询而使用五个查询?
所以,我在 MySQL 工作,编写了一个函数,计算 table 中女性和男性年龄的平均值并进行比较,returns 哪个更大。日期的格式为 YYYY-MM-DD,我使用的是 DATEDIFF()。该函数似乎可以正常工作,但是当我 运行 脚本时,我得到的只是一个带有空值的消息框,而不是它应该输出的响应。
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();
所以,这就是我所做的工作。
虽然你声明了变量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';
您的查询方式太复杂了。为什么不直接使用条件聚合?
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
为什么只能使用一个查询而使用五个查询?