我有一个这样的表:
用户ID地址行1、地址行2、电话第一街1号,某处,123Somewhere第二街1号212432街2号,某处,125Somewhere 24街2号3126Somewhere 25街2号4127
如何将其转换为(输出需要将每个字段放在单独的列中,每个逗号都意味着一个列去限制器):
Somewhere第一街1号,Somewhere第二街123号212432街2号,某处,125,24街,某处3,126,25街,某处4,127
这是我在SSRS做的一份报告。每个用户都可以有一个动态数量的地址,并且最终结果中每个用户都需要在一行上。
这可能不是MSSQL
中的有效方法,但请尝试一下。
SELECT a.UserID,
SUBSTRING(d.Addresses,1, LEN(d.Addresses) - 1) AddressList
FROM
(
SELECT DISTINCT UserID
FROM tableName
) a
CROSS APPLY
(
SELECT [AddressLine1] + ', ' + [AddressLine2] + ', ' + CAST([Phone] as VARCHAR(15)) + ', '
FROM tableName AS B
WHERE A.UserID = B.UserID
FOR XML PATH('')
) D (Addresses)
SQLFiddle演示
试试这个
Declare @t Table([UserID] int, [AddressLine1] varchar(20), [AddressLine2] varchar(20), [Phone] int);
INSERT INTO @t VALUES
(1, 'First Street', 'Somewhere', 123),
(1, 'Second Street', 'Somewhere2', 124),
(2, '32th Street', 'Somewhere', 125),
(2, '24th Street', 'Somewhere3', 126),
(2, '25th Street', 'Somewhere4', 127);
SELECT
[UserID]
, [New Address] =
STUFF((
SELECT ','
+ [AddressLine1]
+ ', '
+ [AddressLine2]
+ ', '
+ CAST([Phone] AS VARCHAR(10))
FROM @t AS t2
WHERE t1.UserID = t2.UserID
FOR XML PATH('')),1,1,'')
FROM @t t1
GROUP BY t1.[UserID]
//结果
UserID新地址
1 First Street, Somewhere, 123,Second Street, Somewhere2, 124
2 32th Street, Somewhere, 125,24th Street, Somewhere3, 126,25th Street, Somewhere4, 127
除了这里描述的方法之外,还有许多其他方法可以解决这个问题。值得一提的是,在Transact-SQL文章中研究连接行值。这是一篇很棒的文章,请花点时间浏览一下(如果你还没有这样做的话)。
希望这能帮助