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

单条SQL统计多表同维度数据:各侦探指定月份的多产品计数

你编写的SQL存在的核心问题
  • 语法硬伤:select子句中三个count统计字段之间缺失逗号分隔;from子句里将where语句直接插在两个连续LEFT JOIN的中间,不符合SQL语法规范,完全无法正常执行。
  • 连接逻辑错误:LEFT JOIN后直接通过where过滤产品表的月份字段,会将外连接退化为内连接——没有匹配到目标月份产品记录的侦探会被直接筛选掉,无法实现全量展示所有侦探的需求。
  • 统计值完全失真:三个无关联的产品明细表同时JOIN到侦探表时,会触发笛卡尔积交叉计算。比如某侦探在指定月份有2条P1记录、3条P2记录、4条P3记录,关联后会生成234=24条交叉的无效记录,最终统计的count值会远大于真实值。
  • 表名/别名错误:group by子句中写的Detective.Detective没有对应的数据表,你定义的侦探表实体名是TDetective,也没有为该表设置Detective的别名。
可正常运行的实现方案

核心思路:先对每个产品表预先按侦探维度聚合,统计出目标月份内每个侦探对应产品的记录数,再将聚合后的结果和侦探表做关联,从根源上避免笛卡尔积问题,同时保留左连接的特性——哪怕某侦探在指定月份没有任何产品记录,也会完整展示该侦探信息,对应统计值为0。

具体SQL代码如下:

SELECT
  td.Detective,
  COALESCE(p1.product_cnt, 0) AS countOfDetectiveP1,
  COALESCE(p2.product_cnt, 0) AS countOfDetectiveP2,
  COALESCE(p3.product_cnt, 0) AS countOfDetectiveP3
FROM TDetective td
-- 关联预聚合的P1统计结果
LEFT JOIN (
  SELECT Detective, COUNT(id) AS product_cnt
  FROM TProduct1
  WHERE Months IN (SELECT Months FROM TMonths)
  GROUP BY Detective
) p1 ON td.Detective = p1.Detective
-- 关联预聚合的P2统计结果
LEFT JOIN (
  SELECT Detective, COUNT(id) AS product_cnt
  FROM TProduct2
  WHERE Months IN (SELECT Months FROM TMonths)
  GROUP BY Detective
) p2 ON td.Detective = p2.Detective
-- 关联预聚合的P3统计结果
LEFT JOIN (
  SELECT Detective, COUNT(id) AS product_cnt
  FROM TProduct3
  WHERE Months IN (SELECT Months FROM TMonths)
  GROUP BY Detective
) p3 ON td.Detective = p3.Detective
ORDER BY td.Detective;

代码里的COALESCE作用是将没有匹配到统计值的空值替换为0,更符合常规统计报表的展示习惯,如果不需要可以直接去掉该函数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 21:45:06