1

検索しましたが、自分のニーズにぴったり合う解決策が見つかりません。また、変更できる解決策も見つかりません。簡単にするために、データベース テーブルには 3 つの列 ( packageIDcarrier、およびsequence) があるとします。どの荷物にも、その荷物を扱った運送業者が 1 つ以上存在する可能性があります。次のようなクエリを実行できます

SELECT packageID, carrier 
FROM packageFlow 
ORDER BY sequence

次のようなパッケージを処理したすべての人のリストを取得するには:

packageID, carrier
1, Bob
1, Jim
1, Sally
1, Ron
2, Reggie
2, Mary
2, Bruce

私が必要とするのは、結果を次のような行にすることです:

packageID|carrier1|carrier2|carrier3|carrier4
   1     |Bob     |Jim     |Sally   |Ron
   2     |Reggie  |Mary    |Bruce

私は何も集約していないので、ピボットは私が必要とすることをしていないようで、CTEも正しく機能させることができません。正しい方向へのナッジをいただければ幸いです。

4

1 に答える 1

3

このデータ変換はPIVOT. SQL Server 2005 以降、行を列に変換する関数があります。

既知の数の値がある場合は、クエリをハードコーディングできます。

select *
from 
(
  select packageid, carrier,
    'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col
  from packageflow
) src
pivot
(
  max(carrier)
  for col in (Carrier_1, Carrier_2, Carrier_3, Carrier_4)
) piv

SQL Fiddle with Demoを参照してください。

Carrier列に変換したい値の数が不明な場合は、動的 SQL を使用できます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.col) 
                    from 
                    (
                      select 'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col
                      from packageFlow
                    ) t                    
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT packageid,' + @cols + ' from 
             (
                select packageid, carrier,
                  ''Carrier_''+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col
                from packageflow
            ) x
            pivot 
            (
                max(carrier)
                for col in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demoを参照してください。

注: をに置き換えorder by packageidますorder by sequence

両方のクエリの結果は次のとおりです。

| PACKAGEID | CARRIER_1 | CARRIER_2 | CARRIER_3 | CARRIER_4 |
-------------------------------------------------------------
|         1 |       Bob |       Jim |     Sally |       Ron |
|         2 |    Reggie |      Mary |     Bruce |    (null) |
于 2013-03-01T17:06:25.350 に答える