0

以下は私のクエリの結果です

Year_Month.........cat1_per......cat2_per........cat3_per......cat4_per
2004_06...............0.892..........0.778............0.467..........0.871
2005_10...............0.790..........0.629............0.581..........0.978

しかし、クエリの出力を

Category...........2004_06..............2005_10
cat1_per.............0.892..................0.790
cat2_per.............0.778..................0.629
cat3_per.............0.467..................0.581
cat4_per.............0.871..................0.978

それを行う最良の方法は何ですか?どんな助けでも大歓迎です。Unpivot を試しましたが、目的の結果が得られませんでした。

4

1 に答える 1

2

RDBMS を指定しませんでしたが、とタグ付けしたので、 sql-server を推測しています。これは実際にはUNPIVOTとの両方PIVOTです。変換する必要がある値がわかっている場合は、静的バージョンを介してそれらをハードコーディングできます。

select *
from
(
  select year_month, value, category
  from table1
  unpivot
  (
    value
    for category in (cat1_per, cat2_per, cat3_per, cat4_per)
  ) un
) x
pivot
(
  max(value)
  for year_month in ([2004_06], [2005_10])
)p

デモで SQL Fiddleを参照してください

変換する値の数が不明な場合は、動的 SQL ピボットを使用できます。

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('Table1') and
               C.name like 'cat%per'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(t.year_month)
                    from Table1 t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select *
      from
      (
        select year_month, value, category
        from table1
        unpivot
        (
          value
          for category in ('+ @colsunpivot +')
        ) un
      ) x
      pivot
      (
        max(value)
        for year_month in ('+ @colspivot +')
      ) p'

exec(@query)

デモで SQL Fiddle を参照してください

どちらも同じ結果になります。

| CATEGORY | 2004_06 | 2005_10 |
--------------------------------
| cat1_per |   0.892 |    0.79 |
| cat2_per |   0.778 |   0.629 |
| cat3_per |   0.467 |   0.581 |
| cat4_per |   0.871 |   0.978 |

UNPIVOTなんらかの理由で関数と関数がなかった場合は、ピボットを解除してステートメントと集約関数をPIVOT組み合わせてピボットすることで、これを複製できます。UNION ALLCASE

select category,
  max(case when year_month = '2004_06' then value end) [2004_06],
  max(case when year_month = '2005_10' then value end) [2005_10]
from
(
  select year_month, cat1_per value, 'cat1_per' category
  from table1
  union all
  select year_month, cat2_per value, 'cat2_per' category
  from table1
  union all
  select year_month, cat3_per value, 'cat3_per' category
  from table1
  union all
  select year_month, cat4_per value, 'cat4_per' category
  from table1
) un
group by category

デモで SQL Fiddle を参照してください

于 2012-10-17T13:27:46.117 に答える