如何为每个组连接来自某一列的所有字符串
Posted
技术标签:
【中文标题】如何为每个组连接来自某一列的所有字符串【英文标题】:How to concatenate all strings from a certain column for each group 【发布时间】:2011-07-05 07:51:31 【问题描述】:假设我有这张表 [Table1]
Name Mark
------- ------
ABC 10
DEF 10
GHI 10
JKL 20
MNO 20
PQR 30
我的 SQL 语句应该是什么来检索如下所示的记录: (按 [mark] 分组)。 我已经完成了 1 和 2 列,但不知道如何完成第三列(将 [name] 与相同的 [mark] 连接)
mark count names
---- ----- -----------
10 3 ABC,DEF,GHI
20 2 JKL,MNO
30 1 PQR
我正在使用 Microsoft SQL。 请帮忙。谢谢
【问题讨论】:
您使用的是什么 DBMS? 微软 SQL。很抱歉没有包含此信息 另见***.com/questions/451415/… See also. 【参考方案1】:如果是 MS SQL 2005 或更高版本。
declare @t table([name] varchar(max), mark int)
insert @t values ('ABC', 10), ('DEF', 10), ('GHI', 10),
('JKL', 20), ('MNO', 20), ('PQR', 30)
select t.mark, COUNT(*) [count]
,STUFF((
select ',' + [name]
from @t t1
where t1.mark = t.mark
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') [values]
from @t t
group by t.mark
输出:
mark count values
----------- ----------- --------------
10 3 ABC,DEF,GHI
20 2 JKL,MNO
30 1 PQR
【讨论】:
不写[values]时没有区别吗? @SQL,它只是别名,所以不管 您应该尝试使用类似Barns & Noble
的名称。这不漂亮。要解决这个问题,你可以这样做。 ***.com/questions/6074321/…【参考方案2】:
这是一个与性能相关的答案!
http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html
在大型查询中使用 XML 函数是性能杀手。
使用 CTE 是性能超级明星。
查看链接,它将解释如何。
我承认完成它的工作更多。
但结果是几百万行的毫秒数。
【讨论】:
链接不够(而且您的博文已经有死链接)。您应该在此处复制答案代码。【参考方案3】:polishchuks 解决方案更优雅,但这基本上是一样的,我们只是以不同的方式处理尾随逗号。
CREATE TABLE #Marks(Name nchar(3), Mark int)
INSERT INTO #Marks
SELECT 'ABC', 10 UNION ALL
SELECT 'DEF', 10 UNION ALL
SELECT 'GHI', 10 UNION ALL
SELECT 'JKL', 20 UNION ALL
SELECT 'MNO', 20 UNION ALL
SELECT 'PQR', 30
SELECT
mark,
[count],
CASE WHEN Len(Names) > 0 THEN LEFT(Names, LEN(Names) -1) ELSE '' END names
FROM
(
SELECT
Mark,
COUNT(Mark) AS [count],
(
SELECT DISTINCT
Name + ', '
FROM
#Marks M1
WHERE M1.Mark = M2.Mark
FOR XML PATH('')
) Names
FROM #Marks M2
GROUP BY Mark
) M
【讨论】:
我不确定在按标记进行分组时是否需要第一个子查询中的第一个 distinct 子句,如果我错了,请纠正我...【参考方案4】:大致基于 Itzik Ben-Gan,Microsoft SQL Server 2005 内部:T-SQL 编程,p。 215:
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1 ;
GO
CREATE TABLE dbo.Table1 ( Name VARCHAR(10), Mark INT ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'ABC', 10 ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'DEF', 10 ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'GHI', 10 ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'JKL', 20 ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'MNO', 20 ) ;
INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'PQR', 30 ) ;
WITH DelimitedNames AS
(
SELECT Mark, T2.Count,
( SELECT Name + ',' AS [text()]
FROM dbo.Table1 AS T1
WHERE T1.Mark = T2.Mark
ORDER BY T1.Mark
FOR XML PATH('')) AS Names
FROM ( SELECT Mark, COUNT(*) AS Count FROM dbo.Table1 GROUP BY Mark ) AS T2
)
SELECT Mark, Count, LEFT(Names, LEN(NAMES) - 1) AS Names
FROM DelimitedNames ;
【讨论】:
以上是关于如何为每个组连接来自某一列的所有字符串的主要内容,如果未能解决你的问题,请参考以下文章
SQL数据库,如何查询数据库内含有某一列(某字段,如name)的所有表
sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果