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

SQLite中按重复OrderID分组 保留其他列并拼接ProductName

同一订单ID下产品名称合并展示的SQL解决方案

要实现按OrderID分组,同时将同一订单下的所有ProductName用逗号分隔完整展示,核心是使用字符串聚合函数。不同数据库的函数语法略有差异,以下是适配你查询语句的改造方案:

MySQL 版本

使用GROUP_CONCAT()函数拼接产品名称,同时确保GROUP BY子句包含所有非聚合列(同一OrderID对应的员工、订单日期等字段是唯一的,可直接纳入分组):

SELECT 
    od.EmployeeID, 
    nv.LastName, 
    nv.FirstName, 
    od.OrderDate, 
    od.ShipperID, 
    od.OrderID,
    GROUP_CONCAT(prod.ProductName SEPARATOR ', ') AS ProductNames,
    SUM(ord.Quantity) AS TotalQuantity  -- 可选:统计该订单总商品数量
FROM Orders AS od
INNER JOIN Employees AS nv ON od.EmployeeID = nv.EmployeeID
INNER JOIN Shippers AS ship ON od.ShipperID = ship.ShipperID
INNER JOIN OrderDetails AS ord ON od.OrderID = ord.OrderID
INNER JOIN Products AS prod ON prod.ProductID = ord.ProductID
WHERE od.EmployeeID = '8' AND DATE(od.OrderDate) >= DATE('1997-01-01') AND ship.ShipperID = '2'
GROUP BY od.OrderID, od.EmployeeID, nv.LastName, nv.FirstName, od.OrderDate, od.ShipperID;
  • GROUP_CONCAT(prod.ProductName SEPARATOR ', '):将同一订单下的所有产品名称用「逗号+空格」分隔拼接成单个字符串
  • 需注意:MySQL默认对GROUP_CONCAT的结果长度有限制,若产品数量较多,可通过SET group_concat_max_len = 10240;临时调整长度上限

PostgreSQL 版本

使用STRING_AGG()函数实现聚合拼接:

SELECT 
    od.EmployeeID, 
    nv.LastName, 
    nv.FirstName, 
    od.OrderDate, 
    od.ShipperID, 
    od.OrderID,
    STRING_AGG(prod.ProductName, ', ') AS ProductNames,
    SUM(ord.Quantity) AS TotalQuantity
FROM Orders AS od
INNER JOIN Employees AS nv ON od.EmployeeID = nv.EmployeeID
INNER JOIN Shippers AS ship ON od.ShipperID = ship.ShipperID
INNER JOIN OrderDetails AS ord ON od.OrderID = ord.OrderID
INNER JOIN Products AS prod ON prod.ProductID = ord.ProductID
WHERE od.EmployeeID = '8' AND od.OrderDate >= '1997-01-01' AND ship.ShipperID = '2'
GROUP BY od.OrderID, od.EmployeeID, nv.LastName, nv.FirstName, od.OrderDate, od.ShipperID;

SQL Server 版本

SQL Server 2017及以上版本

直接使用STRING_AGG()函数:

SELECT 
    od.EmployeeID, 
    nv.LastName, 
    nv.FirstName, 
    od.OrderDate, 
    od.ShipperID, 
    od.OrderID,
    STRING_AGG(prod.ProductName, ', ') AS ProductNames,
    SUM(ord.Quantity) AS TotalQuantity
FROM Orders AS od
INNER JOIN Employees AS nv ON od.EmployeeID = nv.EmployeeID
INNER JOIN Shippers AS ship ON od.ShipperID = ship.ShipperID
INNER JOIN OrderDetails AS ord ON od.OrderID = ord.OrderID
INNER JOIN Products AS prod ON prod.ProductID = ord.ProductID
WHERE od.EmployeeID = '8' AND CONVERT(DATE, od.OrderDate) >= '1997-01-01' AND ship.ShipperID = '2'
GROUP BY od.OrderID, od.EmployeeID, nv.LastName, nv.FirstName, od.OrderDate, od.ShipperID;

SQL Server 2016及更早版本

使用STUFF结合FOR XML PATH的方式实现拼接:

SELECT DISTINCT
    od.EmployeeID, 
    nv.LastName, 
    nv.FirstName, 
    od.OrderDate, 
    od.ShipperID, 
    od.OrderID,
    STUFF((
        SELECT ', ' + prod2.ProductName
        FROM OrderDetails AS ord2
        INNER JOIN Products AS prod2 ON prod2.ProductID = ord2.ProductID
        WHERE ord2.OrderID = od.OrderID
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS ProductNames,
    (SELECT SUM(ord2.Quantity) FROM OrderDetails AS ord2 WHERE ord2.OrderID = od.OrderID) AS TotalQuantity
FROM Orders AS od
INNER JOIN Employees AS nv ON od.EmployeeID = nv.EmployeeID
INNER JOIN Shippers AS ship ON od.ShipperID = ship.ShipperID
INNER JOIN OrderDetails AS ord ON od.OrderID = ord.OrderID
INNER JOIN Products AS prod ON prod.ProductID = ord.ProductID
WHERE od.EmployeeID = '8' AND CONVERT(DATE, od.OrderDate) >= '1997-01-01' AND ship.ShipperID = '2';

内容的提问来源于stack exchange,提问作者Blog Khóa Học

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:06