SQL查询如何统计每部电影对应含NULL的三类性别人数
问题排查
- 统计逻辑问题:
COUNT(字段名)的特性是会跳过该字段为NULL的记录,所以你原来的写法自动排除了Gender为NULL的行,要统计所有符合条件的行数,改用COUNT(*)即可。 - NULL匹配问题:SQL中
IN运算符无法匹配NULL值,你写的P.Gender IN ('Male',NULL, 'Female')实际只能匹配到Male和Female两类,NULL值会被过滤,判断NULL需要单独用IS NULL语法。 - 分组逻辑问题:原语句仅按
MC.MID分组,未将P.Gender加入分组维度,返回的Gender字段取值不符合预期,也无法拆分出三类性别的独立计数。
修正后的查询语句
如果你需要的是「每部电影+每种性别」对应一行的长表格式,和你原来输出结构一致,只是补上NULL类别的计数,用下面的写法:
movie_female_cast = pd.read_sql_query(""" SELECT TRIM(MC.MID) AS movie_id, COUNT(*) AS gender_cnt, P.Gender FROM M_Cast MC INNER JOIN Person P ON P.PID = TRIM(MC.PID) WHERE P.Gender IN ('Male', 'Female') OR P.Gender IS NULL GROUP BY TRIM(MC.MID), P.Gender """,conn)
如果你需要更方便后续pandas处理的宽表格式,每部电影只占一行,三列分别对应Male、Female、NULL的人数,可以用条件聚合写法:
movie_gender_cnt = pd.read_sql_query(""" SELECT TRIM(MC.MID) AS movie_id, SUM(CASE WHEN P.Gender = 'Male' THEN 1 ELSE 0 END) AS male_cnt, SUM(CASE WHEN P.Gender = 'Female' THEN 1 ELSE 0 END) AS female_cnt, SUM(CASE WHEN P.Gender IS NULL THEN 1 ELSE 0 END) AS null_gender_cnt FROM M_Cast MC INNER JOIN Person P ON P.PID = TRIM(MC.PID) GROUP BY TRIM(MC.MID) """,conn)
内容的提问来源于stack exchange,提问作者BKH
相关产品推荐
相关产品推荐

