SQL子查询行数统计报错求助:无法对含聚合函数或子查询的表达式执行聚合
解决SQL行数统计的错误问题
首先咱们直接修正代码,再拆解错误原因:
情况1:仅需统计符合条件的行数
如果你的需求只是知道满足条件的记录总数,不需要返回明细列,用下面的写法即可:
SELECT COUNT(*) AS toplam_kayit_sayisi FROM ARAC_CIKIS a LEFT JOIN KAMERALAR b ON b.KAMERA_ID = a.CIKIS_KAMERA_ID WHERE a.CIKIS_ZAMANI BETWEEN CAST(CAST(SYSUTCDATETIME() AS DATE) AS DATETIME) AND CAST(CAST(SYSUTCDATETIME() AS DATE) AS DATETIME) + '23:59:59' AND a.UCRET > 0;
这里可以优化日期范围的写法,避免毫秒级数据被遗漏的问题:
SELECT COUNT(*) AS toplam_kayit_sayisi FROM ARAC_CIKIS a LEFT JOIN KAMERALAR b ON b.KAMERA_ID = a.CIKIS_KAMERA_ID WHERE a.CIKIS_ZAMANI >= CAST(SYSUTCDATETIME() AS DATE) AND a.CIKIS_ZAMANI < DATEADD(DAY, 1, CAST(SYSUTCDATETIME() AS DATE)) AND a.UCRET > 0;
情况2:同时获取明细数据和总行数
如果既要查看GIRIS_ZAMANI、PLAKA这些明细列,又要知道总记录数,可以用窗口函数COUNT(*) OVER():
SELECT a.GIRIS_ZAMANI, a.CIKIS_ZAMANI, a.PLAKA, a.UCRET, b.KAMERA_ADI, COUNT(*) OVER() AS toplam_kayit_sayisi FROM ARAC_CIKIS a LEFT JOIN KAMERALAR b ON b.KAMERA_ID = a.CIKIS_KAMERA_ID WHERE a.CIKIS_ZAMANI >= CAST(SYSUTCDATETIME() AS DATE) AND a.CIKIS_ZAMANI < DATEADD(DAY, 1, CAST(SYSUTCDATETIME() AS DATE)) AND a.UCRET > 0;
错误原因拆解
你原来的写法里,把一个返回多行多列的子查询直接塞进count()里,这违反了SQL的语法规则:
count()的参数只能是单个表达式(比如列名、*,或者单个值的计算式),它无法处理完整的结果集。- 这种嵌套方式相当于让
count()去聚合另一个查询的结果,直接触发了「无法对包含聚合函数或子查询的表达式执行聚合函数」的错误。
内容的提问来源于stack exchange,提问作者Kaan Tursucu
相关产品推荐
相关产品推荐

