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

编写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错误,大概率是以下两个原因:

  1. 保留关键字冲突:表名Order是SQL的保留关键字,未用引号/反引号包裹,导致解析器无法识别为表名。
  2. 函数语法不匹配:不同SQL引擎对聚合函数的语法要求不同,比如在MySQL环境中使用了PostgreSQL风格的STRING_AGG写法,或者反之,导致解析失败。

三、示例验证

针对你提供的输入数据,上述SQL执行后会输出符合期望的结果:

order_item_idstatus_list
1UNDELIVERED; IN_PROGRESS; REJECTED; ready_to_ship
2APPROVED; on_hold; null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:23:35