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

在Delphi的ADOQuery中使用SQL CASE表达式求和报错如何解决

问题原因及解决方法

核心报错原因

聚合函数SUM与CASE表达式的嵌套顺序错误,你当前的写法是在CASE分支内使用SUM,但DATE_PAI是每行的非聚合字段,既没有出现在GROUP BY子句中,也没有被聚合函数包裹,不符合SQL分组查询的语法规则。

正确逻辑为:把SUM套在CASE表达式外面,逐行判断DATE_PAI的月份是否为1,符合条件就取MT值,不符合就取0,最后对所有判断结果求和。

修复后的完整代码

DataModule2.ADOQuery1_630.SQL.Clear;
// 修正SUM与CASE的嵌套顺序
DataModule2.ADOQuery1_630.SQL.Add('select STATUT, SUM(case when month(DATE_PAI)=1 then MT else 0 end) AS m');
// 注意:table是SQL保留字,此处替换为你实际的业务表名
DataModule2.ADOQuery1_630.SQL.Add('from 你的实际业务表名');
DataModule2.ADOQuery1_630.SQL.Add('where STATUT in(:dd ,:df) and TYPE_QUIT = :l ');
DataModule2.ADOQuery1_630.SQL.Add('group by STATUT');
DataModule2.ADOQuery1_630.Parameters.ParamByName('dd').Value := pm;
DataModule2.ADOQuery1_630.Parameters.ParamByName('df').Value := pp;
DataModule2.ADOQuery1_630.Parameters.ParamByName('l').Value := typeQ;
DataModule2.ADOQuery1_630.Prepared := True;
DataModule2.ADOQuery1_630.Open;

额外注意事项

  • 若你使用的数据库为Oracle,month(DATE_PAI)需要替换为EXTRACT(MONTH FROM DATE_PAI),不同数据库的日期提取函数存在差异,需和实际使用的数据库类型匹配。
  • 若需要统计多个月份的求和值,直接新增多个SUM(CASE ...)的列即可,无需修改GROUP BY逻辑。
  • 不要使用table这类SQL保留字作为表名,若实际表名就是保留字,需要用对应数据库的转义符包裹,比如SQL Server用[table]、MySQL用`table`。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:42:01