这个问题全部适用于SQL Azure。我有一个按年计算各种商品价格的数据集和单价如:
赖斯 - 2007 - 0.5
Rice - 2007 - 0.3
Rice - 2007 - 0.8
小麦 - 2006 - 1.1
小麦 - 2006 - 1.4
等
如何创建一个数据透视表,为我提供每种商品每年支付的最高和最低价格?我知道如何做一个可以给我平均值的数据透视表 - 这很简单。但我需要我的“主”枢轴列为年份,然后每年将有2个“子列”以获得MIN和MAX价格,我不太确定如何做到这一点。救命啊!
答案 0 :(得分:3)
除非我在您的解释中遗漏了某些内容,否则您可以在没有PIVOT功能的情况下轻松完成此操作:
select product,
year,
min(price) MinPrice,
max(price) MaxPrice
from yourtable
group by product, year
如果您希望将数据放在单独的列中,则可以通过几种方法执行此操作。
使用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
UNPIVOT和PIVOT:
UNPIVOT用于将列数据转换为行。进入行后,您可以使用年份创建新列,然后使用pivot:
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。