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

如何将同一BookingId的Booking Created和Booking Cancelled备注合并?

问题背景

现有两张表Bookings和BookingNote:

  • Bookings表包含BookingId及其他预订相关字段;
  • 每当预订信息更新时,会向BookingNote表添加一条备注。

BookingNote表示例数据:

BookingIdNote
123Booking Created
123User Details Updated
123Booking Cancelled

当前执行的SQL语句(注:原语句中Notes应为BookingNote的笔误,已修正):

Select B.BookingId ,
            Case 
            When N.Note = 'Booking Created'  Then N.Note 
            When N.Note = 'Booking Cancelled' Then N.Note 
    End
    
    
    From    Bookings as B
        Join    BookingNote as N
     On B.BookingId = N.BookingId
        Where   N.Note = 'Booking Created'
        Or  N.Note = 'Booking Cancelled'

得到的查询结果:

BookingIdNote
123Booking Cancelled
123Booking Created

需求:当某个BookingId同时存在Booking Created和Booking Cancelled备注时,将这两个备注合并为一条记录,期望结果如下:

BookingIdNote
123Booking Cancelled , Booking Created
解决方案

核心思路是分组聚合:先过滤出目标备注,再按BookingId分组,将多个Note值拼接为单个字符串。以下是主流数据库的实现方式:

1. MySQL/MariaDB

使用GROUP_CONCAT函数:

SELECT 
    B.BookingId,
    GROUP_CONCAT(N.Note SEPARATOR ' , ') AS Note
FROM Bookings AS B
JOIN BookingNote AS N ON B.BookingId = N.BookingId
WHERE N.Note IN ('Booking Created', 'Booking Cancelled')
GROUP BY B.BookingId
-- 可选:指定拼接顺序,比如先显示取消记录
-- GROUP_CONCAT(N.Note ORDER BY N.Note DESC SEPARATOR ' , ') AS Note

2. SQL Server 2017+/Azure SQL

使用STRING_AGG函数:

SELECT 
    B.BookingId,
    STRING_AGG(N.Note, ' , ') AS Note
FROM Bookings AS B
JOIN BookingNote AS N ON B.BookingId = N.BookingId
WHERE N.Note IN ('Booking Created', 'Booking Cancelled')
GROUP BY B.BookingId
-- 可选:指定拼接顺序
-- STRING_AGG(N.Note, ' , ') WITHIN GROUP (ORDER BY N.Note DESC) AS Note

3. Oracle 11g+

使用LISTAGG函数:

SELECT 
    B.BookingId,
    LISTAGG(N.Note, ' , ') WITHIN GROUP (ORDER BY N.Note) AS Note
FROM Bookings AS B
JOIN BookingNote AS N ON B.BookingId = N.BookingId
WHERE N.Note IN ('Booking Created', 'Booking Cancelled')
GROUP BY B.BookingId

4. PostgreSQL

使用STRING_AGG函数:

SELECT 
    B.BookingId,
    STRING_AGG(N.Note, ' , ') AS Note
FROM Bookings AS B
JOIN BookingNote AS N ON B.BookingId = N.BookingId
WHERE N.Note IN ('Booking Created', 'Booking Cancelled')
GROUP BY B.BookingId
-- 可选:指定拼接顺序
-- STRING_AGG(N.Note, ' , ') ORDER BY N.Note DESC AS Note

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:34