SQL Azure-创建复杂数据透视表
这个问题只适用于SQLAzure。我有一个按年份划分的各种商品价格的数据集和一个类似于以下的单价: 大米-2007-0.5 大米-2007-0.3SQL Azure-创建复杂数据透视表,sql,sql-server,pivot,azure-sql-database,pivot-table,Sql,Sql Server,Pivot,Azure Sql Database,Pivot Table,这个问题只适用于SQLAzure。我有一个按年份划分的各种商品价格的数据集和一个类似于以下的单价: 大米-2007-0.5 大米-2007-0.3 大米-2007-0.8 小麦-2006-1.1 小麦-2006-1.4 等 如何创建一个数据透视表,为我提供每种商品每年支付的最高和最低价格?我知道如何做一个数据透视表,它会给我一些类似于平均值的东西——这很容易。但我需要我的“主”轴心栏是年,然后每年都有它的2个“子栏”的最低和最高价格,我不太确定如何做到这一点。救命啊 除非我在您的解释中遗漏了什么
大米-2007-0.8
小麦-2006-1.1
小麦-2006-1.4 等
如何创建一个数据透视表,为我提供每种商品每年支付的最高和最低价格?我知道如何做一个数据透视表,它会给我一些类似于平均值的东西——这很容易。但我需要我的“主”轴心栏是年,然后每年都有它的2个“子栏”的最低和最高价格,我不太确定如何做到这一点。救命啊 除非我在您的解释中遗漏了什么,否则您可以在不使用PIVOT功能的情况下轻松完成此操作:
select product,
year,
min(price) MinPrice,
max(price) MaxPrice
from yourtable
group by product, year
看
如果您希望数据在单独的列中,那么有几种方法可以做到这一点
带大小写的聚合函数:
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
看
取消PIVOT和PIVOT:
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用于将列数据转换为行。进入行后,您可以创建包含年份的新列,然后透视:
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;
看。结果如下:
| PRODUCT | 2006_MINPRICE | 2006_MAXPRICE | 2007_MINPRICE | 2007_MAXPRICE |
---------------------------------------------------------------------------
| Rice | 0 | 0 | 0.3 | 0.8 |
| Wheat | 1.1 | 1.4 | 0 | 0 |
如果您的年数未知,那么您也可以实现动态sql。除非您的解释中遗漏了一些内容,否则您可以在不使用PIVOT函数的情况下轻松实现:
select product,
year,
min(price) MinPrice,
max(price) MaxPrice
from yourtable
group by product, year
看
如果您希望数据在单独的列中,那么有几种方法可以做到这一点
带大小写的聚合函数:
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
看
取消PIVOT和PIVOT:
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用于将列数据转换为行。进入行后,您可以创建包含年份的新列,然后透视:
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;
看。结果如下:
| PRODUCT | 2006_MINPRICE | 2006_MAXPRICE | 2007_MINPRICE | 2007_MAXPRICE |
---------------------------------------------------------------------------
| Rice | 0 | 0 | 0.3 | 0.8 |
| Wheat | 1.1 | 1.4 | 0 | 0 |
如果您有一个未知的年份,那么您还可以实现动态sql。不用担心,@bluefeet将在大约60秒后提供答案。;)不用担心,@bluefeet将在大约60秒后出现,给你一个答案是的,这是很明显的答案。但这是一个以年为列的透视表。所以输出列应该是:Commodity-2006-2007-2008等,然后这些行应该是每年的最小值和最大值。上面的回复将以表格形式给我结果,我需要它作为数据透视。你能编辑你的OP并显示你想要的最小值/最大值在年份中的显示方式吗?这会更容易理解。@JimBeam请看我的编辑,我添加了几个版本,将年份分为几列。谢谢!我认为第二个例子(minmax加case)的思路是正确的。我想它毕竟不是一个支点,它应该给我我所需要的。我试试看。“我很感激。”吉姆很乐意帮忙,它仍然是一个支点。这正是他们过去所说的糟糕的主支点是的,这是很明显的答案。但这是一个以年为列的透视表。所以输出列应该是:Commodity-2006-2007-2008等,然后这些行应该是每年的最小值和最大值。上面的回复将以表格形式给我结果,我需要它作为数据透视。你能编辑你的OP并显示你想要的最小值/最大值在年份中的显示方式吗?这会更容易理解。@JimBeam请看我的编辑,我添加了几个版本,将年份分为几列。谢谢!我认为第二个例子(minmax加case)的思路是正确的。我想它毕竟不是一个支点,它应该给我我所需要的。我试试看。“我很感激。”吉姆很乐意帮忙,它仍然是一个支点。这正是他们过去所说的糟糕的主支点