我正在尝试获取团队表中每个团队的平均年龄,并显示平均年龄低于 30 岁的团队。我在获取每个团队的平均年龄时遇到问题。我还是 SQL 的新手,所以如果我的代码没有任何意义,我提前道歉。
目前代码无效。我需要从出生日期获取年龄,然后获取每支球队所有球员年龄的平均值,并显示 30 岁以下的球员。
这是我的代码:
SELECT
teamName,
teamCity,
(
DATEDIFF( YY, athleteDateOfBirth, GETDATE() )
-
CASE WHEN DATEADD( YY,DATEDIFF( YY, athleteDateOfBirth, GETDATE() ), athleteDateOfBirth ) > GETDATE() THEN 1 ELSE 0 END
) AS [Age]
FROM
team
FULL JOIN athlete ON athlete.teamId = team.teamId
WHERE
athleteDateOfBirth =
(
SELECT
AVG(athleteDateOfBirth) AS 'Avg Age'
FROM
athlete
)
GROUP BY
teamName,
teamCity,
athleteDateOfBirth
HAVING
COUNT( athleteDateOfBirth ) < 30;
要计算团队平均值,您只想按团队信息分组。考虑到这一点,您也不需要
full join
,因为如果某人不在团队中,他们不会影响团队平均水平,因此请使用inner join
.
SELECT
teamName
, teamCity
, AVG(DATEDIFF(YY, athleteDateOfBirth, GETDATE()) - CASE
WHEN DATEADD(YY, DATEDIFF(YY, athleteDateOfBirth, GETDATE()), athleteDateOfBirth) > GETDATE()
THEN 1
ELSE 0
END
) AS [AvAge]
FROM team
INNER JOIN athlete ON athlete.teamId = team.teamId
GROUP BY
teamName
, teamCity
HAVING AVG(DATEDIFF(YY, athleteDateOfBirth, GETDATE()) - CASE
WHEN DATEADD(YY, DATEDIFF(YY, athleteDateOfBirth, GETDATE()), athleteDateOfBirth) > GETDATE()
THEN 1
ELSE 0
END
) < 30;
NB:如果你追求的是无偏见的团队平均水平,你真的不需要 where 子句。比方说,如果您只选择 30 岁以下的球员,那么您的超额结果就会产生偏差(并且每支球队的平均得分都会低于 30)。
替代语法:
with cte as (
SELECT
teamName
, teamCity
, AVG(DATEDIFF(YY, athleteDateOfBirth, GETDATE()) - CASE
WHEN DATEADD(YY, DATEDIFF(YY, athleteDateOfBirth, GETDATE()), athleteDateOfBirth) > GETDATE()
THEN 1
ELSE 0
END
) AS [AvAge]
FROM team
INNER JOIN athlete ON athlete.teamId = team.teamId
GROUP BY
teamName
, teamCity
)
select
*
from CTE
where AvAge < 30
此处计算列 AvAge 可用于第二个查询和最后一个 where 子句,因此您不使用 having 子句。