如何通过SQL统计多列组合各自对应的合作方数量
SQL实现方案
统计所有属性列的唯一值组合对应的合作方数量,直接按照所有需要分组的属性列做分组,再对partner_id去重计数即可,基础实现代码如下:
SELECT 属性列1, 属性列2, 属性列3, -- 替换为你实际需要统计的所有属性列,和表中实际列名对应 COUNT(DISTINCT partner_id) AS 合作方数量 FROM 你的表名 -- 替换为你实际的数据表名 GROUP BY 属性列1, 属性列2, 属性列3 -- 此处列要和SELECT中的非聚合列完全一致
补充说明
- 若你的表中同一个partner_id在同一组属性组合下只会出现一次,可以将
COUNT(DISTINCT partner_id)替换为COUNT(*),查询性能会更好。 - 若你需要返回包含合作方数量为0的全量属性组合,可使用笛卡尔集先生成所有属性组合再关联统计,实现代码如下:
WITH all_attr_combinations AS ( SELECT t1.属性列1, t2.属性列2, t3.属性列3 -- 替换为所有需要统计的属性列 FROM (SELECT DISTINCT 属性列1 FROM 你的表名) t1 CROSS JOIN (SELECT DISTINCT 属性列2 FROM 你的表名) t2 CROSS JOIN (SELECT DISTINCT 属性列3 FROM 你的表名) t3 -- 每多一个属性列就新增一行CROSS JOIN对应逻辑 ) SELECT a.属性列1, a.属性列2, a.属性列3, COUNT(DISTINCT p.partner_id) AS 合作方数量 FROM all_attr_combinations a LEFT JOIN 你的表名 p ON a.属性列1 = p.属性列1 AND a.属性列2 = p.属性列2 AND a.属性列3 = p.属性列3 -- 所有属性列的关联条件要补全 GROUP BY a.属性列1, a.属性列2, a.属性列3
- 若使用的数据库版本不支持WITH语法(如MySQL 5.x),将上述CTE部分替换为FROM后的子查询即可正常执行。
内容的提问来源于stack exchange,提问作者Alex.Six
相关产品推荐
相关产品推荐

