2016-12-28 29 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