排序查询 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 查询报告中跨列求和行

将 Access Crosstab/PIVOT 查询转换为 T-SQL

R语言dplyr包和tidyr包创建交叉表(列联表crosstab)实战

pandas pivot_table透视表crosstab交叉表aggfunc函数详解及实战

使用pd.crosstab()以后,怎么调整字段顺序?