如何在 sql 中查找平均年龄?

问题描述 投票:0回答:1

我正在尝试获取团队表中每个团队的平均年龄,并显示平均年龄低于 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;
mysql sql datetime average
1个回答
0
投票

要计算团队平均值,您只想按团队信息分组。考虑到这一点,您也不需要

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 子句。

© www.soinside.com 2019 - 2024. All rights reserved.