排序查询 Crosstab Postgres
Posted
技术标签:
【中文标题】排序查询 Crosstab Postgres【英文标题】:Ordering query Crosstab Postgres 【发布时间】:2014-05-07 07:10:34 【问题描述】:我正在尝试在 Postgres 中旋转表格。我的表“样本”有很多列(代码、部门、项目、年份、期间、价值、预购),而不是有 1 个概念、1 年、每行 1 个值,我想要按年份计算的概念。从此;
Item Value Year PreOrder
Sales 50 2011 1
Costs -20 2011 2
GrossProfit 30 2011 3
Expenses -5 2011 4
Tax -3 2011 5
Profit 22 2011 6
Sales 45 2012 3
Costs -20 2012 4
GrossProfit 25 2012 5
Expenses -5 2012 6
Tax -3 2012 7
Profit 17 2012 8
到这里:
Item 2011 2012
Sales 50 45
Costs -20 -20
GrossProfit 30 25
Expenses -5 -5
Tax -3 -3
Profit 22 17
在 Postgres 中使用交叉表:
Select * from crosstab($$Select item, year, value from sec_sample
Where cik=320193
AND period='Annual'
AND Sector='Agro'
Order by year, preorder
$$,
$$VALUES ('2011'::int), ('2012')$$)
AS value("item" varchar(255), "2011" numeric(20,2), "2012" numeric(20,2));
但是这会导致:
Item 2011 2012
Sales 50
Costs -20
GrossProfit 30
Expenses -5
Tax -3
Profit 22
Sales 45
Costs -20
GrossProfit 25
Expenses -5
Tax -3
Profit 17
知道如何修改我的查询吗?谢谢
【问题讨论】:
【参考方案1】:AFAIK,要按item
分组,您必须按item
订购:
Select * from crosstab($$Select item, year, value from sec_sample
Where cik=320193
AND period='Annual'
AND Sector='Agro'
Order by item, year, preorder
$$,
$$VALUES ('2011'::int), ('2012')$$)
AS value("item" varchar(255), "2011" numeric(20,2), "2012" numeric(20,2));
但您可以不使用crosstab
进行旋转,如下所示:
select
s.item,
sum(case when s.year = 2011 then s.value else 0 end) as "2011",
sum(case when s.year = 2012 then s.value else 0 end) as "2012"
from sec_sample as s
group by s.item
order by min(s.preorder)
我觉得修改这种类型的查询比较容易
sql fiddle demo
【讨论】:
我尝试了您的查询,尽管它按订单分组,但不应按项目排序,而是按“预购”列排序。按项目排序按字母顺序排列,这并不是真正想要的结果。看我的例子。 @Bondifrench 我已经更改了第二个查询,现在它已订购以上是关于排序查询 Crosstab Postgres的主要内容,如果未能解决你的问题,请参考以下文章
MS Access CrossTab 查询 - 跨 3 个表
将 Access Crosstab/PIVOT 查询转换为 T-SQL
R语言dplyr包和tidyr包创建交叉表(列联表crosstab)实战