sql—特定值组的平均值

dluptydi  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(361)

我试图选择一部特定电影的平均租客年龄作为人口统计的依据。
我的数据与

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

它似乎是所有年龄段的平均值,并返回它作为每部电影的平均值,我不知道为什么会发生这种情况

rqmkfv5c

rqmkfv5c1#

查询的问题是子查询与外部查询没有正确关联。您再次从中选择 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 子句):这个几十年前的旧语法不应该用在新代码中。

相关问题