如何统计num_zaprosa/num_otveta时纳入全量数据且过滤单NULL结果
问题解决
需求:统计num_zaprosa和num_otveta的计数时纳入所有记录,但结果集中不显示任一字段为NULL的记录。
你的原代码核心问题是按num_zaprosa和num_otveta联合分组,这会把22|null和22|9999拆成两个独立分组,无法合并统计同一num_zaprosa的总记录数。
正确SQL实现
WITH zaprosa_total AS ( -- 先计算每个num_zaprosa的总记录数(包含所有关联记录,不管num_otveta是否为NULL) SELECT num_zaprosa, COUNT(*) AS count_num_zaprosa FROM your_table GROUP BY num_zaprosa ) SELECT t.num_zaprosa, t.num_otveta, z.count_num_zaprosa, COUNT(*) AS count_num_otveta -- 当前num_zaprosa+num_otveta组合下的非NULL记录数 FROM your_table t JOIN zaprosa_total z ON t.num_zaprosa = z.num_zaprosa WHERE t.num_otveta IS NOT NULL -- 过滤掉num_otveta为NULL的记录,确保结果集无NULL GROUP BY t.num_zaprosa, t.num_otveta, z.count_num_zaprosa;
结果验证
基于你的初始数据,执行上述SQL会得到如下结果:
| num_zaprosa | num_otveta | count_num_zaprosa | count_num_otveta |
|---|---|---|---|
| 2344 | 200 | 2 | 2 |
| 22 | 9999 | 2 | 1 |
| 155 | 6 | 1 | 1 |
完全匹配你的期望:
num_zaprosa=22的总计数包含了22|null这条记录,但结果集只展示22|9999- 所有结果行的
num_zaprosa和num_otveta均不为NULL
内容的提问来源于stack exchange,提问作者John B
相关产品推荐
相关产品推荐

