Laravel 9:单查询内带条件的SUM与COUNT聚合函数使用问题
问题出在这几个地方
- 聚合函数里不能直接写
WHERE,这不符合SQL语法规范 - 你之前写的
SUM(amount AND type = "dispute"),本质是把符合条件的记录转成1、不符合的转成0,求和后得到的是记录数而非金额总和 - 你的
DB::raw代码中,各个字段之间缺少逗号,这会直接导致SQL语法错误
修正后的代码
$query = DB::table('cash_table') ->where('transaction_created', '>=', Carbon::now()->startOfWeek()) ->select(DB::raw(' SUM(amount) as transaction_amount, COUNT(amount) as transaction_count, SUM(CASE WHEN type = "dispute" THEN amount ELSE 0 END) as charge_amount, COUNT(CASE WHEN type = "dispute" THEN amount END) as charge_count, SUM(CASE WHEN type = "loan" THEN loan_amount ELSE 0 END) as loan_amount, COUNT(CASE WHEN type = "loan" THEN loan_amount END) as loan_count ')) ->groupBy('transaction_created') ->get();
逻辑说明
- 带条件的SUM:通过
CASE WHEN判断类型,符合条件时取对应金额,不符合时取0,这样SUM就能得到目标类型的金额总和 - 带条件的COUNT:
CASE WHEN仅在符合条件时返回字段值,不符合时返回NULL,而COUNT()会自动忽略NULL值,因此能精准统计目标类型的记录数;也可以用SUM(CASE WHEN type = "dispute" THEN 1 ELSE 0 END)实现同样效果 - 务必保证每个字段之间用逗号分隔,这是SQL的基础语法要求
内容的提问来源于stack exchange,提问作者karen
相关产品推荐
相关产品推荐

