2016-12-28 44 views
0

我有一个表purchases这样的:Postgres的交叉表和汇总在一起

purchase_id|purchase_date|product_id 
    1  | 2016-02-04 | 17 
    2  | 2016-02-04 | 19 
    3  | 2016-02-04 | 17 
    ... About 1 million entries 

和一张桌子products这样的:

product_id 
    17 
    18 
    19 
    ... About 30 entries 

我想要做一个交叉表查询给我在每个product_id上的采购总数,如下所示:

purchase_date|product_id_17|product_id_18|product_id_19|product_id... 
    2016-02-04 | 2   | 0   | 1   | ... 
    2016-02-05 | ... 

注意th在这个表中的值是而不是取自任何记录,但是匹配的记录总数。我相信这是可能的,使用crosstab与聚合,但一直没能弄清楚如何做到这一点。

  1. 这可以使用Postgres完成吗?
  2. 交叉表是正确的做法吗?
  3. 如何?

有什么独特这里就是我想:

  • 做一个交叉
  • 做一个汇总
  • 同时

注意的其他问题上堆栈溢出讨论交叉表不解释如何做一个交叉表并聚合在一起。

+0

[PostgreSQL的交叉表查询]的可能的复制(http://stackoverflow.com/questions/3002499/postgresql-crosstab-query) – GurV

+0

@GurwinderSingh编辑,以澄清的差 – SRobertJames

回答

1

有了以下为样本

表-1

create table prods(purchase_id int,purchase_date date,product_id int); 

数据 -

insert into prods values (1,'2016-02-04',17); 
insert into prods values (2,'2016-02-04',19); 
insert into prods values (3,'2016-02-04',17); 
insert into prods values (4,'2016-02-05',17); 
insert into prods values (5,'2016-02-05',17); 

为了得到所需的输出,你可以使用crosstab() -

select * 
from crosstab(' 
select purchase_date 
     ,product_id 
     ,count(product_id)::int 
from prods 
group by purchase_date 
     ,product_id 
order by purchase_date 
     ,product_id 
') as t("purchase_date" date 
     ,"product_id_17" int 
     ,"product_id_19" int 
     ) 

输出 -

purchase_date product_id_17 product_id_19 
------------- ------------- ------------- 
2016-02-04 2    1    
2016-02-05 2    NULL