SQL技术咨询:如何筛选1990年后含12部及以上影片的流派
解决方法:用HAVING子句筛选分组结果,调整分组维度
看起来你已经走对了一半,不过有两个关键问题需要调整:一是你的GROUP BY包含了PRODUCTION_YEAR,这会让你得到每个流派+年份组合的统计,而不是整个流派的汇总;二是筛选分组后数量≥12的流派,需要用HAVING子句(而不是WHERE,因为WHERE是过滤单条数据,HAVING是过滤分组后的结果)。
修正后的SQL语句
SELECT GENRE_CODE AS "Genre", COUNT(TITLE) AS "How many titles in this genre", MIN(PURCHASE_PRICE) AS "Cheapest", MAX(PURCHASE_PRICE) AS "Most Expensive", AVG(PURCHASE_PRICE) AS "Average" FROM MOVIE WHERE PRODUCTION_YEAR > 1990 GROUP BY GENRE_CODE HAVING COUNT(TITLE) >= 12;
关键调整说明
- 去掉
PRODUCTION_YEAR的分组和SELECT:因为你要统计的是整个流派的汇总数据,一个流派会包含多个年份的电影,把PRODUCTION_YEAR加入GROUP BY会拆分你的分组,导致统计结果是每年的细分数据,而不是流派整体。 - 使用
HAVING筛选分组:WHERE子句只能在分组前过滤单条记录,而我们需要在分组完成后,筛选出影片数量≥12的流派,这时候HAVING COUNT(TITLE) >= 12就可以实现这个需求——它会检查每个分组的影片计数,只保留符合条件的流派。 - 可选优化:如果
TITLE字段可能存在NULL值,用COUNT(*)代替COUNT(TITLE)会更准确,因为COUNT(*)会统计所有行,而COUNT(TITLE)会忽略NULL的标题。
补充说明(如果需要显示流派名称)
如果你的GENRE_CODE是编码(比如数字),想要显示流派的名称(比如"Action"、"Comedy"),可以关联对应的流派表(假设表名为GENRE,有GENRE_CODE和GENRE_NAME字段),示例如下:
SELECT g.GENRE_NAME AS "Genre", COUNT(m.TITLE) AS "How many titles in this genre", MIN(m.PURCHASE_PRICE) AS "Cheapest", MAX(m.PURCHASE_PRICE) AS "Most Expensive", AVG(m.PURCHASE_PRICE) AS "Average" FROM MOVIE m JOIN GENRE g ON m.GENRE_CODE = g.GENRE_CODE WHERE m.PRODUCTION_YEAR > 1990 GROUP BY g.GENRE_CODE, g.GENRE_NAME HAVING COUNT(m.TITLE) >= 12;
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

