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

SQL计算两个SUM结果差值时出现1064语法错误如何解决

错误原因

触发1064语法错误的核心原因是子查询的子句顺序不符合SQL语法规则:

  • SQL的SELECT查询有固定的书写顺序要求,必须遵循SELECT [计算逻辑/字段] FROM [表名] WHERE [过滤条件]的结构。你编写的两个子查询都把FROM表声明放在了WHERE过滤条件之后,数据库解析到WHERE关键词时无法匹配到对应的查询表,直接抛出语法异常,和错误提示里标注的出错位置完全吻合。
  • 额外注意:CURDATE()是MariaDB内置函数,函数名和后续括号之间不要加多余空格,虽然部分版本会兼容这种写法,但容易触发不必要的解析问题。
修正方案

写法1:保留原有子查询做差逻辑,仅修正语法顺序

调整两个子查询里FROM和WHERE的位置即可正常执行,建议给计算结果加别名方便读取:

SELECT (
    (SELECT SUM(`amount`) FROM `plugin_reward_aggregated` WHERE `reward_user_id` = 89)
    -
    (SELECT SUM(`amount`) FROM `plugin_reward_aggregated` WHERE `download_date` >= CURDATE())
) AS amount_diff;

写法2:单表条件聚合(性能更优)

两次求和都来自同一张表,可以通过条件聚合一次遍历表就计算出结果,避免两次扫描表数据,数据量大时性能提升明显:

SELECT 
    SUM(CASE WHEN `reward_user_id` = 89 THEN `amount` ELSE 0 END)
    -
    SUM(CASE WHEN `download_date` >= CURDATE() THEN `amount` ELSE 0 END) 
AS amount_diff
FROM `plugin_reward_aggregated`;

补充:如果过滤条件没有匹配到任何记录,SUM()函数会返回NULL,NULL参与算术运算的最终结果也是NULL。如果需要把无匹配记录的场景按求和值为0处理,可以给SUM函数套一层COALESCE(SUM(xxx), 0)将NULL转为0再计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:57:20