0

以下のようなデータがあります

    Set        Cost        Times
    ----------------------------
    GHT        100         20
    GHA        80          30
    GHE        70          10

行数が多い場合と少ない場合があります。上記の例を使用して、引き戻したいのは次のようなものです。

Col1     Col2     Col3     Col4     Col5      Col6     Col7     Col8     Col9
-----------------------------------------------------------------------------
GHT      100      20       GHA      80        30       GHE      70       10

前もって感謝します

JJ

4

1 に答える 1

2

返される行数が不明であるため、動的 SQL を実装して結果を取得する必要があります。また、3 つの列のピボットを解除してから PIVOT を適用して行を列に戻す必要があるため、2 段階のプロセスになります。

SQL Server 2005 以降を使用しているので、CROSS APPLY を使用してデータのピボットを解除できます。row_number()データの行が列に戻ったときにグループ化されていることにも気付くでしょう。データを UNPIVOT するコードは次のようになります。

select col+'_'+cast(rn as varchar(50)) col,
  value
from
(
  select [set] as st, cost, times,
    row_number() over(order by (select 1)) rn
  from yourtable
) d
cross apply
(
  values 
   ('set', st), 
   ('cost', cast(cost as varchar(50))),
   ('times', cast(times as varchar(50)))
) c (col, value);

デモを参照してください。これにより、データが次の形式に変換されます。

|     COL | VALUE |
-------------------
|   set_1 |   GHT |
|  cost_1 |   100 |
| times_1 |    20 |

データが複数の行になったら、PIVOT を適用できます。動的 SQL コードは次のようになります。

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

select @cols = STUFF((SELECT ',' + QUOTENAME(col+'_'+cast(rn as varchar(50))) 
                    from 
                    (
                      select row_number() over(order by (select 1)) rn
                      from yourtable
                    ) d
                    cross apply
                    (
                      select 'set', 1 union all
                      select 'cost', 2 union all
                      select 'times', 3
                    ) c (col, so)   
                    group by col, rn, so
                    order by rn, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' 
            from 
            (
              select col+''_''+cast(rn as varchar(50)) col,
                value
              from
              (
                select [set], cost, times,
                  row_number() over(order by (select 1)) rn
                from yourtable
              ) d
              cross apply
              (
                values 
                  (''set'', [set]), 
                  (''cost'', cast(cost as varchar(50))),
                  (''times'', cast(times as varchar(50)))
              ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute(@query);

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| SET_1 | COST_1 | TIMES_1 | SET_2 | COST_2 | TIMES_2 | SET_3 | COST_3 | TIMES_3 |
----------------------------------------------------------------------------------
|   GHT |    100 |      20 |   GHA |     80 |      30 |   GHE |     70 |      10 |
于 2013-06-20T15:25:57.083 に答える