使用SQL将多行合并到单个列中
我有一个一对多的表,如果有行具有相同的引用id(段落id),我希望将其连接起来,以便LoginName值在同一行中具有多个 此查询执行我希望它执行的操作,但有一个问题,它将替换第一个字符。STUFF函数需要一个replace值 我的问题: 如何在不替换第一个字符的情况下执行此操作使用SQL将多行合并到单个列中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个一对多的表,如果有行具有相同的引用id(段落id),我希望将其连接起来,以便LoginName值在同一行中具有多个 此查询执行我希望它执行的操作,但有一个问题,它将替换第一个字符。STUFF函数需要一个replace值 我的问题: 如何在不替换第一个字符的情况下执行此操作 SELECT DISTINCT ParagraphID , STUFF(( SELECT N'|' + CAST([LoginName] AS VARCHA
SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N'|' + CAST([LoginName] AS VARCHAR(255))
FROM [dbo].[CM_Signature] f2
WHERE f1.ParagraphID = f2.ParagraphID
FOR XML PATH ('')), 1, 2, '') AS FileNameString
FROM [dbo].[CM_Signature] f1
期望值:
Daniel | Emma
你是从位置2开始的,而不是从第一个开始
SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N'|' + CAST([LoginName] AS VARCHAR(255))
FROM [dbo].[CM_Signature] f2
WHERE f1.ParagraphID = f2.ParagraphID
FOR XML PATH ('')), 1, 1, '') AS FileNameString
FROM [dbo].[CM_Signature] f1 SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N'|' + CAST([name] AS VARCHAR(255))
FROM mytable f2
WHERE f1.paragraphid = f2.paragraphid
FOR XML PATH ('')), 1, 1, '') AS FileNameString
FROM mytable f1
使用此代码:
create table #test (paragraghid int,name VARCHAR(10))
insert into #test values(1929,'Daniel')
insert into #test values(1929,'Emma')
insert into #test values(1935,'Daniel')
select distinct paragraghid,STUFF((select ' | ' + name from #test a
Where a.paragraghid=b.paragraghid for XML PATH('') ),1,2,'') as FilenameString
from #test b
以下是您可以使用的:
SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N' | ' + CAST([LoginName] AS VARCHAR(255))
FROM [dbo].[CM_Signature] f2
WHERE f1.ParagraphID = f2.ParagraphID
FOR XML PATH ('')), 1, 1, '') AS FileNameString
FROM [dbo].[CM_Signature] f1
注意填充(“…”,1,1,”)
而不是填充(“…”,1,2,”)
。
因为您需要替换1个字符而不是2个字符(以删除第一个|
)
输出:
Daniel|Emma
Daniel | Emma
另外,如果希望在|
前后都有空格,只需使用以下查询:
SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N' | ' + CAST([LoginName] AS VARCHAR(255))
FROM [dbo].[CM_Signature] f2
WHERE f1.ParagraphID = f2.ParagraphID
FOR XML PATH ('')), 1, 3, '') AS FileNameString
FROM [dbo].[CM_Signature] f1
请注意,这次我们删除了3个字符(STUFF(“…”,1,3,”)
)
输出:
Daniel|Emma
Daniel | Emma
您可以将查询编写为:
DECLARE @CM_Signature table
(
RowId int,
ParagraphID int,
LoginName varchar(10))
Insert into @CM_Signature values
(4,1929,' Daniel'),
(5,1929,' Emma '),
(6,1935,'Daniel')
SELECT DISTINCT
ParagraphID
, STUFF((
SELECT N'| ' + CAST(rtrim(ltrim([LoginName])) AS VARCHAR(255))
FROM @CM_Signature f2
WHERE f1.ParagraphID = f2.ParagraphID
FOR XML PATH ('')), 1, 1, '') AS FileNameString
FROM @CM_Signature f1
给出示例数据和预期输出…在我看来,您好像在某处窃取了此查询,而您不知道发生了什么;)@KavinChakaravarthi更新您的预期输出是
Aniel | Emma
还是Daniel | Emma
?这很令人困惑,因为你提供的样本与你的描述不符。@sébastienSevrin Daniel | Emma