特定值组的平均值

Average of specific group of values

我正在尝试 select 出于人口统计目的的特定电影租户的平均年龄。

我的数据类似于

Movies
movie_id    movie_title
1           Spider Man
2           Avengers
3           Thor
Customers
customer_id    customer_dob
1              1989-03-05
2              1994-02-12
3              2001-05-01
Customer_rentals
rental_id    customer_id    movie_id
1            1              1
2            1              3
3            2              2
4            2              1
5            3              1

我想看的是

Title        Avg_Age
Spider Man   25
Avengers     26
Thor         31

我试过以下方法

select m.movie_title as Title, avg(all_ages.age) as avg_age
from
    movies m,
    (select ((0 + convert(char(8), getdate(),112) - convert(char(8),c.customer_dob,112)) / 10000) as age
    from customers c, movies m, customer_rentals cr
    where m.movie_id=cr.movie_id
    and cr.customer_id=c.customer_id) all_ages
group by m.movie_title

这给了我

Title         Avg_Age
Spider Man    25
Avengers      25
Thor          25

它似乎取了所有年龄段的平均值并将其作为每部电影的平均值返回,我不确定为什么会这样

您的查询的问题是子查询与外部查询的关联不正确。您正在从 movie 中再次选择(使用与外部查询中相同的别名 - m - 这令人困惑),而您应该与外部查询中的记录相关。

这可以通过直接连接和聚合来简化:

select 
    m.movie_title as Title, 
    avg((0 + convert(char(8), getdate(),112) - convert(char(8),c.customer_dob,112)) / 10000) as avg_age
from movies m
inner join customer_rentals cr on cr.movie_id = m.movie_id 
inner join customers c         on c.customer_id = cr.customer_id
group by m.movie_id, m.movie_title

请注意,这使用 标准 ,显式连接(使用 on 关键字)而不是隐式连接(在 from 子句中使用逗号):这种几十年前的旧语法不应在新代码中使用。