0

この質問はすべて SQL Azure に関するものです。年ごとのさまざまな商品価格と次のような単価のデータセットがあります。

米 - 2007 - 0.5
米 - 2007 - 0.3
米 - 2007 - 0.8
小麦 - 2006 - 1.1
小麦 - 2006 - 1.4
など

商品ごとに毎年支払われる最大価格と最小価格を示すピボット テーブルを作成するにはどうすればよいですか? 平均のようなものを提供するピボット テーブルの作成方法を知っています。これは非常に簡単です。しかし、「メイン」ピボット列を年にする必要があり、その後、毎年、最小価格と最大価格の 2 つの「サブ列」が必要になりますが、その方法がよくわかりません。ヘルプ!

4

1 に答える 1

3

あなたの説明に何かが欠けていない限り、PIVOT関数なしで簡単にこれを行うことができます:

select product,
  year,
  min(price) MinPrice,
  max(price) MaxPrice
from yourtable
group by product, year

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

別々の列にデータが必要な場合は、いくつかの方法でこれを行うことができます。

CASE を使用した集計関数:

select product,
  min(case when year=2006 then price else 0 end) [2006_MinPrice],
  max(case when year=2006 then price else 0 end) [2006_MaxPrice],
  min(case when year=2007 then price else 0 end) [2007_MinPrice],
  max(case when year=2007 then price else 0 end) [2007_MaxPrice]
from yourtable
group by product

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

アンピボットとピボット:

UNPIVOT は、列データを行に変換するために使用されます。行に入ったら、年を使用して新しい列を作成し、ピボットできます。

select *
from
(
  select product, 
    cast(year as varchar(4))+'_'+col as piv_col,
    value
  from
  (
    select product,
      year,
      min(price) MinPrice,
      max(price) MaxPrice
    from yourtable
    group by product, year
  ) x
  unpivot
  (
    value for col in (minPrice, maxPrice)
  ) u
) d
pivot
(
  max(value)
  for piv_col in ([2006_MinPrice], [2006_MaxPrice],
                  [2007_MinPrice], [2007_MaxPrice])
) piv;

SQL Fiddle with Demoを参照してください。これらは結果を与えます:

| PRODUCT | 2006_MINPRICE | 2006_MAXPRICE | 2007_MINPRICE | 2007_MAXPRICE |
---------------------------------------------------------------------------
|    Rice |             0 |             0 |           0.3 |           0.8 |
|   Wheat |           1.1 |           1.4 |             0 |             0 |

年数が不明な場合は、動的SQLを実装することもできます。

于 2013-04-04T15:58:39.660 に答える