如何在SQL中统计每种布尔组合对应的匹配行数?
解决布尔组合对应计数的问题
你的问题核心在于:之前的子查询没有和外层的每一行布尔组合建立关联,所以它每次都会返回全表的总记录数,而不是当前行对应布尔组合的统计值。下面给你几种可行的解决方案:
方法1:条件聚合(最简洁高效)
直接在SELECT语句中使用CASE WHEN配合聚合函数,针对每一行的布尔组合统计对应的数据量:
假设你的原始数据存储在your_table表中,布尔组合表是你给出的四行数据(如果这个组合表是临时的,也可以用子查询生成),SQL代码如下:
SELECT t1.Column_A, t1.Column_B, SUM(CASE WHEN t2.Column_A = t1.Column_A AND t2.Column_B = t1.Column_B THEN 1 ELSE 0 END) AS Column_C FROM (-- 生成所有布尔组合的数据集 SELECT True AS Column_A, True AS Column_B UNION ALL SELECT True, False UNION ALL SELECT False, True UNION ALL SELECT False, False ) t1 CROSS JOIN your_table t2 GROUP BY t1.Column_A, t1.Column_B;
也可以用COUNT简化写法(CASE不满足条件时返回NULL,COUNT会自动忽略NULL值):
SELECT t1.Column_A, t1.Column_B, COUNT(CASE WHEN t2.Column_A = t1.Column_A AND t2.Column_B = t1.Column_B THEN 1 END) AS Column_C FROM (SELECT True AS Column_A, True AS Column_B UNION ALL SELECT True, False UNION ALL SELECT False, True UNION ALL SELECT False, False ) t1 CROSS JOIN your_table t2 GROUP BY t1.Column_A, t1.Column_B;
方法2:关联子查询(明确绑定行关系)
给子查询加上和外层行的关联条件,确保子查询只统计当前行对应的布尔组合:
SELECT t1.Column_A, t1.Column_B, (SELECT COUNT(*) FROM your_table t2 WHERE t2.Column_A = t1.Column_A AND t2.Column_B = t1.Column_B) AS Column_C FROM (SELECT True AS Column_A, True AS Column_B UNION ALL SELECT True, False UNION ALL SELECT False, True UNION ALL SELECT False, False ) t1;
这里的关键是用表别名t1(外层组合表)和t2(原始数据表),在子查询的WHERE子句中绑定两者的Column_A和Column_B,让子查询只返回当前行对应布尔组合的计数。
方法3:先分组统计再关联
先对原始数据表按Column_A和Column_B分组计数,再和你的布尔组合表做左连接,确保所有组合都能被返回(即使原始表中没有对应组合,计数会显示为0):
SELECT t1.Column_A, t1.Column_B, COALESCE(t2.count_num, 0) AS Column_C FROM (SELECT True AS Column_A, True AS Column_B UNION ALL SELECT True, False UNION ALL SELECT False, True UNION ALL SELECT False, False ) t1 LEFT JOIN ( SELECT Column_A, Column_B, COUNT(*) AS count_num FROM your_table GROUP BY Column_A, Column_B ) t2 ON t1.Column_A = t2.Column_A AND t1.Column_B = t2.Column_B;
用COALESCE可以把原始表中无对应组合时的NULL值转换成0,更符合统计逻辑。
内容的提问来源于stack exchange,提问作者Johann Schwaller
相关产品推荐
相关产品推荐

