编写SQL按交付时间聚合订单子项状态遇语法错误,求解决方案
解决SQL按时间排序合并同ID的status字段问题
根据需求,需要按delivered_date_time的顺序合并同一order_item_id的status字段,以下针对不同SQL引擎给出正确写法,并分析你遇到的语法错误原因:
一、针对不同数据库的正确SQL写法
1. PostgreSQL / BigQuery 环境
这两个引擎支持STRING_AGG函数,且允许在函数内直接指定排序规则,注意表名Order是SQL保留关键字,需要用双引号包裹:
SELECT order_item_id, STRING_AGG(status, '; ' ORDER BY delivered_date_time ASC) AS status_list FROM "Order" GROUP BY order_item_id;
如果需要保留NULL值(比如示例中的null),PostgreSQL/BigQuery默认会排除NULL,若要保留可以用COALESCE转换:
STRING_AGG(COALESCE(status, 'null'), '; ' ORDER BY delivered_date_time ASC) AS status_list
2. MySQL 环境
MySQL使用GROUP_CONCAT函数,语法与STRING_AGG略有不同,且默认忽略NULL值,需要用IFNULL转换以保留示例中的null:
SELECT order_item_id, GROUP_CONCAT(IFNULL(status, 'null') ORDER BY delivered_date_time ASC SEPARATOR '; ') AS status_list FROM `Order` -- MySQL用反引号包裹关键字表名 GROUP BY order_item_id;
二、语法错误原因分析
你遇到的no viable alternative at input错误,大概率是以下两个原因:
- 保留关键字冲突:表名
Order是SQL的保留关键字,未用引号/反引号包裹,导致解析器无法识别为表名。 - 函数语法不匹配:不同SQL引擎对聚合函数的语法要求不同,比如在MySQL环境中使用了PostgreSQL风格的
STRING_AGG写法,或者反之,导致解析失败。
三、示例验证
针对你提供的输入数据,上述SQL执行后会输出符合期望的结果:
| order_item_id | status_list |
|---|---|
| 1 | UNDELIVERED; IN_PROGRESS; REJECTED; ready_to_ship |
| 2 | APPROVED; on_hold; null |
内容的提问来源于stack exchange,提问作者Anusha Nair
相关产品推荐
相关产品推荐

