0

SQLで正確な転置をどのように達成しますか?

Month | High | Low | Avg
-------------------------
Jan   | 10    | 9   | 9.5
-------------------------
Feb   | 8  |  7   | 7.5
-------------------------
Mar   | 7    | 6   | 6.5
-------------------------

結果

------ Jan | Feb | Mar
--------------------------
High-- 10  | 8   | 7
--------------------------
Low--  9   | 7   | 6
--------------------------
Avg    9.5 | 7.5 | 6.5
--------------------------
4

2 に答える 2

1

pivotとの優れた用途unpivot:

with t as (
    select 'Jan' as mon, cast(10.0 as float) as high, cast(9.0 as float) as low, cast(9.5 as float) as average union all
    select 'Feb' as mon, 8.0, 7.0, 7.5
   )
select stat, Jan, Feb, Mar
from (select mon, STAT, value
      from t
      unpivot  (value for stat in (high, low, average)) u
     ) t
pivot (max(value) for mon in (Jan, Feb, Mar)) as pt
于 2013-03-27T15:20:21.163 に答える
1

結果を得るには、最初に、および列を行に変換してアンピボットする必要があります。次に、ピボット関数を適用して値を列に変換します。(参照: MSDN PIVOT/UNPIVOTドキュメント)HighLowAvgmonth

SQL Server 2008+ を使用CROSS APPLYVALUESているため、 と を使用してピボットを解除できます。アンピボットするコードは次のとおりです。

select t.month, 
  c.col, 
  c.value
from yourtable t
cross apply
(
  values ('High', high), ('Low', Low), ('Avg', Avg)
) c (col, value)

SQL Fiddle with Demoを参照してください。これにより、月ごとにピボットできる形式で結果が得られます。

| MONTH |  COL | VALUE |
------------------------
|   Jan | High |    10 |
|   Jan |  Low |     9 |
|   Jan |  Avg |   9.5 |
|   Feb | High |     8 |
|   Feb |  Low |     7 |

データが行になったら、ピボット関数を適用すると、コードは次のようになります。

select col, Jan, Feb, Mar
from
(
  select t.month, 
    c.col, 
    c.value
  from yourtable t
  cross apply
  (
    values ('High', high), ('Low', Low), ('Avg', Avg)
  ) c (col, value)
) d
pivot
(
  sum(value)
  for month in (Jan, Feb, Mar)
) piv

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

|  COL | JAN | FEB | MAR |
--------------------------
|  Avg | 9.5 | 7.5 | 6.5 |
| High |  10 |   8 |   7 |
|  Low |   9 |   7 |   6 |

月の名前をピボットしているので、これの動的 SQL バージョンが必要だとは思いませんが、値の数が不明な場合は、動的 SQL を使用して結果を取得できます。

于 2013-03-27T15:28:15.730 に答える