3

他の列のデータが同じであることに基づいて、データの 1 つの列を複数 (必要に応じて 1 から 5 の間) に分割しようとしています。
これは、クエリ後の私のデータの例です。

FirstName    LastName    StreetName    StreetNumber    AccountNumber
John         Smith       Fake St       123             10
John         Smith       Fake St       123             20
John         Smith       Fake St       123             30
John         Smith       Fake St       123             40

これは、同じアドレスの同じ人物が最大 5 つのアカウントを複数持つことができるという事実に基づいています。結果が次のようになる必要があります。

FirstName    LastName    StreetName    StreetNumber    AccountNumber1    AccountNumber2    AccountNumber3    AccountNumber4    AccountNumber5
John         Smith       Fake St       123             10                20                30                40                NULL

そのため、名前/住所が同じであるという基準に基づいて、accountNumber 列を複数の列に分割する必要があります。5 つの新しい列を作成し、空のフィールドを NULL 値にしたいと考えています。誰でも助けることができますか?

4

1 に答える 1

4

シンプルなピボットを使用できます:

with cte as (
    select
        *,
        'AccountNumber' + 
        cast(
          row_number()
          over(
              partition by [FirstName], [LastName], [StreetName], [StreetNumber]
              order by AccountNumber
          )
        as nvarchar(max)) as rn
    from Table1
)
select *
from cte
pivot (
    max(AccountNumber)
    for rn in (
        [AccountNumber1],
        [AccountNumber2],
        [AccountNumber3],
        [AccountNumber4],
        [AccountNumber5]
    )
) as p;

または、手でピボットすることもできます:

with cte as (
    select
        *,
        row_number()
        over(
            partition by [FirstName], [LastName], [StreetName], [StreetNumber]
            order by AccountNumber
        ) as rn
    from Table1
)
select
    [FirstName], [LastName], [StreetName], [StreetNumber],
    max(case when rn = 1 then AccountNumber end) as AccountNumber1,
    max(case when rn = 2 then AccountNumber end) as AccountNumber2,
    max(case when rn = 3 then AccountNumber end) as AccountNumber3,
    max(case when rn = 4 then AccountNumber end) as AccountNumber4,
    max(case when rn = 5 then AccountNumber end) as AccountNumber5
from cte
group by [FirstName], [LastName], [StreetName], [StreetNumber]

sql fiddle demo

于 2013-11-01T20:05:22.690 に答える