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

SQL获取合同统计数据报错:Scalar subquery produced more than one element

解决标量子查询返回多行的SQL错误

你遇到的Scalar subquery produced more than one element错误,问题出在计算at_least_one的子查询里——这个子查询加了GROUP BY ESTRATO,导致它会返回每个ESTRATO对应的统计值,也就是多行结果,但主查询的SELECT子句里的标量子查询要求只能返回单个值,两者冲突就抛出了错误。

修正后的代码

我们可以用条件聚合替代子查询,写法更简洁高效,完美实现你的需求:

#standardSQL
WITH estrato_contrato AS (
  SELECT 
    ESTRATO, 
    CONTRATO, 
    COUNT(*) AS contract_occurrences 
  FROM `mytable` 
  GROUP BY ESTRATO, CONTRATO
)
SELECT 
  ESTRATO,
  -- 只出现1次的合同数量
  COUNT(DISTINCT IF(contract_occurrences = 1, CONTRATO, NULL)) AS only_once_contract,
  -- 该分组下的总记录数
  SUM(contract_occurrences) AS total_records,
  -- 至少出现2次的合同数量(对应你原代码的at_least_one意图)
  COUNT(DISTINCT IF(contract_occurrences > 1, CONTRATO, NULL)) AS at_least_twice_contract
FROM estrato_contrato
GROUP BY ESTRATO

关键说明

  1. 条件聚合的作用:COUNT(DISTINCT IF(条件, 字段, NULL))会只统计满足条件的字段值,不符合条件的会被转为NULL,而COUNT会忽略NULL,这样就能精准筛选出我们需要的合同类型。
  2. 别名优化:把原来的count改成contract_occurrences,让字段含义更清晰,避免和聚合函数COUNT混淆。
  3. 错误根源回顾:原代码里的子查询因为加了GROUP BY ESTRATO,输出是多行结果,而主查询每行只能对应一个标量值,所以触发了报错。用条件聚合可以避免这个问题,同时让查询逻辑更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:06