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

