特定值组的平均值
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
子句中使用逗号):这种几十年前的旧语法不应在新代码中使用。
我正在尝试 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
子句中使用逗号):这种几十年前的旧语法不应在新代码中使用。