SQL语法错误求助:基于双条件对同类值求和计算出勤积分
解决SQL语法错误并实现需求
错误原因分析
你遇到的ODBC::Error: 37000 (1003) SQL compilation error: syntax error line 8 at position 8 unexpected 'GROUP'错误,核心原因是WHERE子句末尾多了一个分号。这个多余的分号会让数据库误以为前面的SELECT语句已经结束,后面的GROUP BY被当成了一条独立的不完整语句,直接触发语法报错。
除此之外,原SQL的逻辑也需要调整:你需要先过滤出forgiven=0且日期在近90天内的记录,再按driver_id分组计算积分总和,最后用6减去这个总和得到目标值,原SQL的CASE WHEN用法不符合这个逻辑顺序。
修正后的SQL语句
SELECT driver_id, 6 - SUM(attendance_points) AS total_attendance_points FROM attendance_events WHERE forgiven = 0 AND date >= DATEADD('day', -90, CURRENT_DATE()) -- 确保包含当前日期往前90天内的所有记录 GROUP BY driver_id;
关键调整说明
- 移除了WHERE子句末尾的多余分号,让GROUP BY与前面的SELECT成为同一条完整语句
- 在WHERE中新增
forgiven=0的过滤条件,提前排除不需要参与计算的记录 - 调整日期条件为
date >= DATEADD('day', -90, CURRENT_DATE())(原SQL用<会漏掉90天当天的记录,更符合“往前90天内”的需求) - 简化计算逻辑:因为已经提前过滤了
forgiven=0的记录,不需要再用CASE WHEN判断,直接分组求和后用6相减即可
示例数据验证
用你提供的示例数据执行修正后的SQL,会得到以下结果:
| driver_id | total_attendance_points |
|---|---|
| 8087956 | -1 |
| 1160725 | -2 |
7922706因为forgiven=1被过滤,不会出现在结果集中。
内容的提问来源于stack exchange,提问作者Keanson Ye
相关产品推荐
相关产品推荐

