あなたの説明に何かが欠けていない限り、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を実装することもできます。