如何用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
相关产品推荐
相关产品推荐

