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

如何用GROUP BY实现Family列值横向展示,查询关联Family的ITEMID

需求说明

需要通过GROUP BY语句将Table1表中的Family列值横向拼接展示,同时查询每个ITEMID所关联的所有Family信息。

建表语句(修正语法错误后)

原建表语句存在语法问题,Family字段未指定数据类型,修正后如下:

CREATE TABLE Table1
(
    [ITEMID] int, 
    [Family] varchar(15)
);

插入数据语句(修正语法错误后)

原插入语句存在多处逗号缺失问题,修正后如下:

INSERT INTO Table1
([ITEMID], [Family])
VALUES
('1234', 'F1'),
('1234', 'F2'),
('1234', 'F3'),
('12345', 'F1'),
('12345', 'F2'),
('12345', 'F4'),
('123457', 'F1'),
('123457', 'F2'),
('123457', 'F3'),
('223457', 'F1'),
('223457', 'F2'),
('423458', 'F8');

预期结果

ITEMID--FAMILY
1234----F1,F2,F3
12345---F1,F2,F4
123457--F1,F2,F3
223457--F1,F2
423458--F8

实现方案

不同数据库的字符串聚合函数不同,以下是主流数据库的具体实现:

MySQL/MariaDB

使用GROUP_CONCAT函数直接拼接:

SELECT 
    ITEMID,
    GROUP_CONCAT(Family SEPARATOR ',') AS FAMILY
FROM Table1
GROUP BY ITEMID;

SQL Server(2017+)

用STRING_AGG函数实现:

SELECT 
    ITEMID,
    STRING_AGG(Family, ',') AS FAMILY
FROM Table1
GROUP BY ITEMID;

如果是低版本SQL Server(2016及以下),可以用FOR XML PATH的方式拼接:

SELECT 
    DISTINCT t.ITEMID,
    STUFF((SELECT ',' + Family 
           FROM Table1 
           WHERE ITEMID = t.ITEMID 
           FOR XML PATH('')), 1, 1, '') AS FAMILY
FROM Table1 t;

Oracle(11gR2+)

使用LISTAGG函数:

SELECT 
    ITEMID,
    LISTAGG(Family, ',') WITHIN GROUP (ORDER BY Family) AS FAMILY
FROM Table1
GROUP BY ITEMID;

PostgreSQL

用STRING_AGG函数:

SELECT 
    ITEMID,
    STRING_AGG(Family, ',' ORDER BY Family) AS FAMILY
FROM Table1
GROUP BY ITEMID;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:37:41