按type列从expense_incomes表取数SQL报错 需单条SQL按日期分组统计收支汇总
核心问题解答
原CASE写法的合规性判断
- 原写法存在两处本质逻辑缺陷,完全无法实现预期需求:
- 功能错位:将用于生成分类标识的CASE语句错误塞入
WHERE子句。WHERE的作用是过滤符合条件的数据行,不承担生成分类字段、参与聚合分组的功能 - 维度缺失:原SQL仅以日期作为分组依据,没有将收支类型纳入分组规则,就算把CASE语句移到正确位置,也无法输出同一天下支出、收入的分开统计结果
- 功能错位:将用于生成分类标识的CASE语句错误塞入
语法报错的原因与修复方案
- 报错触发根源:一是你将带别名的CASE表达式嵌套在WHERE的括号结构内,完全不符合MariaDB的语法解析规则;二是CASE语句的别名位置错误,
AS Type需要写在END关键字的后续,不能嵌入CASE的结构内部。两处错误共同触发了1064语法报错 - 可根据实际输出需求选择对应正确写法:
- 需求为「一行对应某天某类收支的汇总值」
因为表中type字段本身已经存储了Expense/Income的标识,完全不需要写多余的CASE转换,直接按日期+type双维度分组即可:SELECT SUM(amount) AS amount, CAST(date AS DATE) AS dateAdded, type AS Type FROM expense_incomes GROUP BY CAST(date AS DATE), type - 需求为「一行对应某天的汇总,同行同时展示当天总支出、总收入两个值」
使用条件聚合逻辑,将CASE放到SELECT的聚合函数内部,不需要放在WHERE子句中:SELECT CAST(date AS DATE) AS dateAdded, SUM(CASE WHEN type = 'Expense' THEN amount ELSE 0 END) AS total_expense, SUM(CASE WHEN type = 'Income' THEN amount ELSE 0 END) AS total_income FROM expense_incomes GROUP BY CAST(date AS DATE)
- 需求为「一行对应某天某类收支的汇总值」
- 对应Laravel中的调用写法直接把上面的SQL替换进
DB::select()即可,不需要做额外修改
内容的提问来源于stack exchange,提问作者Ihtisham Khan
相关产品推荐
相关产品推荐

