SQL查询问题:按类别统计公司时重复计数的解决方法
解决SQL分组统计公司重复计数的问题
你的问题出在COUNT(s.entity)会统计所有关联的记录,而部分公司对应多条llx_propal条目,导致同一公司被多次计数。要实现每个公司仅统计一次,需要用COUNT(DISTINCT 唯一公司标识)替代普通COUNT。
修改后的查询语句:
SELECT c.label AS category, COUNT(DISTINCT s.rowid) AS company_count FROM llx_categorie c INNER JOIN llx_categorie_societe cs ON c.rowid = cs.fk_categorie INNER JOIN llx_societe s ON cs.fk_soc = s.rowid INNER JOIN llx_propal p ON s.rowid = p.fk_soc WHERE p.datec BETWEEN '2023-01-01' AND '2023-01-31' GROUP BY c.label ORDER BY category ASC
关键修改说明:
- 将
COUNT(s.entity)改为COUNT(DISTINCT s.rowid):s.rowid是公司表的唯一主键(如果entity是公司唯一标识,也可以用COUNT(DISTINCT s.entity)),确保每个公司仅被计数一次,不受关联llx_propal条数影响。 - 移除
SELECT DISTINCT:按category分组后每个类别仅返回一条结果,该关键字在此处多余。 GROUP BY明确使用c.label(若存在类别重名情况,用c.rowid分组更严谨),保证分组逻辑准确。
如果需要先筛选符合日期条件的唯一公司再关联类别统计,也可以用子查询实现,数据量大时性能可能更优:
SELECT c.label AS category, COUNT(DISTINCT cs.fk_soc) AS company_count FROM llx_categorie c INNER JOIN llx_categorie_societe cs ON c.rowid = cs.fk_categorie WHERE cs.fk_soc IN ( SELECT DISTINCT p.fk_soc FROM llx_propal p WHERE p.datec BETWEEN '2023-01-01' AND '2023-01-31' ) GROUP BY c.label ORDER BY category ASC
内容的提问来源于stack exchange,提问作者Erick
相关产品推荐
相关产品推荐

