imdb 数据集 select 根据年份的电影计数,其中只有女性演员的电影

imdb dataset select movie count according to year with movies with only female cast

报告每年只有女性演员的电影的百分比,以及当年制作的电影总数。例如,一个答案是:1990 31.81 13522 表示 1990 年有 13,522 部电影,其中 31.81% 的电影只有女性演员。您不需要四舍五入您的答案。

以下代码

select a.year, a.c*100.00/b.c as percentage, b.c as total_overall
from (select z.year, count(*) as c
      from movie z
      where not exists (select *
                        from person x,M_cast xy
                        where x.pid = xy.pid and xy.mid = z.mid and x.Gender!='Female')
      group by z.year) a,
     (select z.year, count(*) as c from movie z group by z.year) b
where a.year=b.year
order by a.year;

以下代码无效

select z.year, count(*)
from movie z
where not exists (select *
                  from actor x, casts xy
                  where x.id = xy.pid and xy.mid = z.id and x.gender!='F')
group by z.year;

请告诉我如何查询只有女性的电影select 以下输出我得到

指导我如何select只有女性演员的电影

如何为上述语句编写sql查询

您可以使用两个聚合级别:

select movie_year, count(*) no_movies, avg(has_male_actor = 0) ratio
from (
    select m.year movie_year, max(p.gender = 'Male') has_male_actor
    from movie m
    inner join m_cast mc on mc.mid = m.mid
    inner join person p on pid = mc.pid
    group by m.mid, m.year
) t
group by movie_year

子查询为每部电影生成一行,并带有一个标志,指示是否有男性演员出现在演员阵容中。然后,外部查询按年份聚合,并计算只有女性演员的电影的数量和比例(表示为 01 之间的十进制数)。

@gmb 给出的答案是正确的,因为他不知道您的数据是否包含任何噪声,并且他根据您在上面图像中提到的模式编写了查询。但是当我遇到同样的问题陈述时,我 运行 它发现电影 table 的年份列在它前面包含一些 spaces and roman values 像:- 'I 1945' 和之后一些修改,它 运行s 在你提到的 'IMDB movies DB' 和 returns 上成功地得到了正确的结果。

这是针对上述问题陈述的修改后的查询:-

select  movie_year, count(*) no_movies, avg(has_male_actor = 0)*100 ratio
from (
    select CAST(SUBSTR(m.year,-4) AS UNSIGNED) movie_year, max(p.gender = 'Male') has_male_actor
    from movie m
    inner join m_cast mc on TRIM(mc.mid) = TRIM(m.mid)
    inner join person p on TRIM(p.pid) = TRIM(mc.pid)
    group by m.mid, m.year
) t
group by movie_year