【问题标题】:SQL Azure - Create complex Pivot TableSQL Azure - 创建复杂的数据透视表
【发布时间】:2013-04-04 15:49:26
【问题描述】:

这个问题都是针对 SQL Azure 的。我有一个按年份列出的各种商品价格的数据集和一个单价,例如:

大米 - 2007 - 0.5
水稻 - 2007 - 0.3
水稻 - 2007 - 0.8
小麦 - 2006 - 1.1
小麦 - 2006 - 1.4
等等

如何创建一个数据透视表,为我提供每年为每种商品支付的最高和最低价格?我知道如何做一个可以给我平均值的数据透视表——这很容易。但是我需要我的“主要”枢轴列作为年份,然后每年都会有 2 个“子列”,分别对应 MIN 和 MAX 价格,我不太确定该怎么做。救命!

【问题讨论】:

  • 不用担心,@bluefeet 将在大约 60 秒后给您答复。 ;)

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


【解决方案1】:

除非我在您的解释中遗漏了某些内容,否则您可以在没有 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 用于将列数据转换为行。进入行后,您可以使用年份创建新列,然后进行透视:

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。

【讨论】:

  • 是的,这是相当明显的答案。但这是一个以年份为列的数据透视表。所以输出列就像:Commodity-2006-2007-2008 等,然后行将是每年的最小值和最大值。上面的回复会给我表格格式的结果,我需要它作为一个支点
  • 您可以编辑您的 OP 并显示您希望如何显示年份的最小值/最大值吗?这样会更容易理解。
  • @JimBeam 查看我的编辑,我添加了几个版本,将年份分成几列。
  • 谢谢!我认为第二个示例(带案例的最小最大值)是正确的。我想它毕竟不是一个支点,它应该给我我需要的东西。我会试试的。我很感激。
  • @JimBeam 很高兴提供帮助,它仍然是一个支点。这正是他们过去所说的糟糕的主要支点。 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2012-07-20
  • 2020-08-18
  • 2015-04-22
  • 1970-01-01
  • 2021-01-19
  • 2012-12-28
相关资源
最近更新 更多