1

次のようなテーブルがあります。

ユーザー ID AddressLine1、AddressLine2、Phone
1、ファーストストリート、どこか、123
1、セカンドストリート、どこか2、124
2、32番街、どこか、125
2、24番街、どこか3、126
2、25番街、どこか4、127

これを次のように変換するにはどうすればよいですか (出力には各フィールドを別々の列に入れる必要があります。各コンマは列区切り文字を意味します):

1、ファースト ストリート、どこか、123、セカンド ストリート、どこか 2、124
2、32 番街、どこか、125、24 番街、どこか 3、126、25 番街、どこか 4、127

これは、私が SSRS で行っているレポート用です。各ユーザーは動的な数の住所を持つことができ、最終結果ではすべての住所がユーザーごとに 1 つの行にある必要があります。

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]

//結果

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 の記事で行の値を連結する方法を調べてください。これは素晴らしい記事です。時間をかけて読んでください (まだ読んでいない場合)。

お役に立てれば

于 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 に答える