SQL Azure - 创建复杂的数据透视表

时间:2013-04-04 15:49:27

标签: sql sql-server pivot azure-sql-database pivot-table

这个问题全部适用于SQL Azure。我有一个按年计算各种商品价格的数据集和单价如:

赖斯 - 2007 - 0.5
Rice - 2007 - 0.3
Rice - 2007 - 0.8
小麦 - 2006 - 1.1
小麦 - 2006 - 1.4

如何创建一个数据透视表,为我提供每种商品每年支付的最高和最低价格?我知道如何做一个可以给我平均值的数据透视表 - 这很简单。但我需要我的“主”枢轴列为年份,然后每年将有2个“子列”以获得MIN和MAX价格,我不太确定如何做到这一点。救命啊!

1 个答案:

答案 0 :(得分: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 with Demo

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。