WITH CTE_TableName AS (
SELECT FieldA, FieldB
FROM TableName)
SELECT t0.FieldA
, STUFF((
SELECT ',' + t1.FieldB
FROM CTE_TableName t1
WHERE t1.FieldA = t0.FieldA
ORDER BY t1.FieldB
FOR XML PATH('')), 1, LEN(','), '') AS FieldBs
FROM CTE_TableName t0
GROUP BY t0.FieldA
ORDER BY FieldA;
SQLite
排序需要CTE或子查询
WITH CTE_TableName AS (
SELECT FieldA, FieldB
FROM TableName
ORDER BY FieldA, FieldB)
SELECT FieldA
, GROUP_CONCAT(FieldB, ',') AS FieldBs
FROM CTE_TableName
GROUP BY FieldA
ORDER BY FieldA;
无需订购
SELECT FieldA
, GROUP_CONCAT(FieldB, ',') AS FieldBs
FROM TableName
GROUP BY FieldA
ORDER BY FieldA;
select FieldA, string_agg(FieldB, '') as data
from yourtable
group by FieldA
查看SQL Fiddle演示 在SQL Server中,您可以使用FOR XML PATH来取得结果:
select distinct t1.FieldA,
STUFF((SELECT distinct '' + t2.FieldB
from yourtable t2
where t1.FieldA = t2.FieldA
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,0,'') data
from yourtable t1;
这可能对某些人也很有用,例如,用于数据分析和数据概要类型的目的。(例如,不按分组)。 在SQL Server 2017 STRING_AGG之前,函数已存在。 (i.e.仅返回一行..)
SELECT DISTINCT
SUBSTRING(
STUFF((
SELECT DISTINCT ',' + [FieldB]
FROM tablename
ORDER BY 1
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
, 1, 0, '')
, 2, 9999)
FROM tablename
4条答案
按热度按时间zour9fqk1#
MySQL数据库
Oracle和 db2
PostgreSQL数据库
SQL服务器
SQL Server 2017及以上版本和Azure SQL
SQL Server ≤ 2016(包括CTE以鼓励DRY principle)
SQLite
排序需要CTE或子查询
无需订购
lztngnrs2#
从SQL Server 2017开始,可以使用
STRING_AGG
函数,这大大简化了逻辑:查看SQL Fiddle演示
在SQL Server中,您可以使用
FOR XML PATH
来取得结果:查看SQL Fiddle演示
ufj5ltwl3#
在SQL Server 2017中添加了STRING_AGG:
此外,STRING_SPLIT适用于相反的情况,并且在SQL Server 2016中可用
a8jjtwal4#
这可能对某些人也很有用,例如,用于数据分析和数据概要类型的目的。(例如,不按分组)。
在SQL Server 2017
STRING_AGG
之前,函数已存在。(i.e.仅返回一行..)
它返回逗号分隔的值-例如“A,B”。