在SQL Server中,通过将多行中的一行追加到右侧,使之成为多行中



我有一个这样的表:

用户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文章中研究连接行值。这是一篇很棒的文章,请花点时间浏览一下(如果你还没有这样做的话)。

希望这能帮助

最新更新