You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL按MCall分组计算LOG表积分及去重统计区域数量问题咨询

问题1解决方案

你的原查询直接对sm、mm非空的情况各加1分,没有处理两个值相等时要扣减1分的规则,可改用CASE WHEN逐行计算单条记录的积分后再聚合,同时移除不需要的非聚合字段sm、mm和冗余的DISTINCT:

SELECT 
  MCall,
  SUM(
    CASE
      WHEN sm != '' AND mm != '' THEN IF(sm = mm, 1, 2)
      WHEN sm != '' OR mm != '' THEN 1
      ELSE 0
    END
  ) AS points
FROM LOG 
WHERE conf = '1' 
GROUP BY MCall 
ORDER BY points DESC

逻辑说明:

  • 仅处理conf=1的有效记录
  • 当sm和mm都非空时:相等得1分,不等得2分
  • 只有单个字段非空时得1分
  • 两个都为空得0分
问题2解决方案

COUNT(DISTINCT sm, mm)统计的是(sm,mm)值对的去重数量,不符合你要合并两个字段值再去重统计的需求,可先通过UNION ALL将sm、mm拆为单列,再聚合统计:

SELECT 
  MCall,
  COUNT(DISTINCT area_val) AS areas
FROM (
  SELECT MCall, sm AS area_val FROM LOG WHERE conf = '1' AND sm != ''
  UNION ALL
  SELECT MCall, mm AS area_val FROM LOG WHERE conf = '1' AND mm != ''
) AS t
GROUP BY MCall

逻辑说明:

  • 内层查询分别取出所有有效记录的非空sm、mm值,统一到area_val字段
  • 外层按MCall分组,对合并后的区域值去重计数,结果和预期一致

内容的提问来源于stack exchange,提问作者user3260939

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:54:05