mysql 用于组合物料订单id的不同状态的Sql查询

ki1q1bka  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(49)

我有三个专栏

1.order_item_id where datatype is STRING,
2.delivered_date_time where datatype is TIMESTAMP ,
3.status where datatype is string ,

字符串
写一个SQL查询来组合合并特定order_item_id的不同状态,并以分号分隔,order_item_id的第一个delivered_date_time应该排在第一位,order_item_id的第二个delivered_date_time应该排在第二位,依此类推。
我用STRING_AGG和GROUP_CONCAT函数写了一个查询,但它给了我下面的错误-
查询验证失败

Syntax Validation: [PARSING] Error while parsing query line 3:25: no viable alternative at input 'SELECT\n order_item_id,\nSTRING_AGG(status, '; ' ORDER'


SQL查询:-

SELECT
  order_item_id,
 GROUP_CONCAT(status ORDER BY delivered_date_time ASC SEPARATOR '; ') as  status_list
//STRING_AGG(status, '; ' ORDER BY delivered_date_time ASC) AS status_list
FROM
  Order
GROUP BY
  order_item_id;


有人能帮我解决这个问题吗?
例如-

order_ITEM_ID   status  
1            UNDELIVERED  
1            IN_PROGRESS  
1            REJECTED  
1            ready_to_ship  
2            APPROVED  
2            on_hold  
2            null


输出:-

order_ITEM_ID status  
1   UNDELIVERED;IN_PROGRESS;REJECTED ;  ready_to_ship  
2   APPROVED;on_hold;null

xcitsw88

xcitsw881#

如果您使用的是SQL Server 2017或更高版本,则可以选择使用STRING_AGG函数,如下所示:

STRING_AGG(status, '; ') 
  WITHIN GROUP (ORDER BY delivered_date_time ASC) AS status_list

字符串
在SQL Server 2017之前,我们需要使用STUFF函数。
有关该函数的更多详细信息,请参阅STRING_AGG documentation

unhi4e5o

unhi4e5o2#

目前还不清楚问题中的数据库是SQL Server还是MySQL

使用SQL Server:

您可以使用STRING_AGG函数来连接状态,并根据delivered_date_time对它们进行排序。

SELECT 
    ID,
    STRING_AGG(status, ';') WITHIN GROUP (ORDER BY delivered_date_time) AS status_combined
FROM 
    order_status
GROUP BY 
    ID

字符串
See this db<>fiddle的一个。

使用MySql:

在MySQL中,使用GROUP_CONCAT函数合并每个ID的状态,并根据其delivered_date_time对状态进行排序。

SELECT ID, GROUP_CONCAT(status ORDER BY delivered_date_time SEPARATOR ';') AS status
FROM order_status
GROUP BY ID;


See this db<>fiddle的一个。

相关问题