1

我有一张这样的桌子:

用户 ID 地址线路 1、地址线路 2、电话
1,第一街,某处,123
1, 第二街, Somewhere2, 124
2,第 32 街,某处,125
2, 24th Street, Somewhere3, 126
2, 25th Street, Somewhere4, 127

如何将其转换为(输出需要将每个字段放在单独的列中,每个逗号都表示一个列分隔符):

1,第一街,某处,123,第二街,某处2,124
2, 32th Street, Somewhere, 125, 24th Street, Somewhere3, 126, 25th Street, Somewhere4, 127

这是我在 SSRS 中所做的报告。每个用户都可以拥有动态数量的地址,并且在最终结果中它们都需要在每个用户的单行上。

4

2 回答 2

3

尝试这个

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]

//结果

用户 ID 新地址

1   First Street, Somewhere, 123,Second Street, Somewhere2, 124
2   32th Street, Somewhere, 125,24th Street, Somewhere3, 126,25th Street, Somewhere4, 127

除了这里描述的方法之外,还有许多其他方法可以解决同样的问题。值得一提的是,在 Transact-SQL文章中查看 Concatenating Row Values。这是一篇很棒的文章,请花一些时间来阅读它(如果你还没有这样做的话)。

希望这可以帮助

于 2012-09-03T03:21:47.983 回答
3

这可能不是有效的方法,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 演示

于 2012-09-03T02:45:23.997 回答