我试图选择一部特定电影的平均租客年龄作为人口统计的依据。
我的数据与
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
它似乎是所有年龄段的平均值,并返回它作为每部电影的平均值,我不知道为什么会发生这种情况
1条答案
按热度按时间rqmkfv5c1#
查询的问题是子查询与外部查询没有正确关联。您再次从中选择
movie
(使用与外部查询中相同的别名-m
-这很混乱),而您应该与来自外部查询的记录相关联。这可以通过直接联接和聚合来简化:
请注意,这使用标准的显式联接(与
on
关键字)而不是隐式联接(在from
子句):这个几十年前的旧语法不应该用在新代码中。