我有一张这样的桌子:

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

还有一张这样的桌子:
product_id
   17
   18
   19
   ... About 30 entries

我想做一个交叉表查询,以给出日期上每个产品id上的总购买次数,如下所示:
 purchase_date|product_id_17|product_id_18|product_id_19|product_id...
   2016-02-04 |   2         |  0          |  1          | ...
   2016-02-05 | ...

请注意,此表中的值不是从任何记录中获取的,而是匹配记录数的总和。我相信使用purchases和聚合是可能的,但是还没有弄清楚如何做到这一点。
这可以用Postgres完成吗?
交叉表是正确的方法吗?
怎么用?
这里的独特之处在于我试图:
做交叉表
聚合
同时
注意,讨论交叉表的堆栈溢出的其他问题并没有解释如何将交叉表和聚合在一起。

最佳答案

以下为样本
桌子-

 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

关于sql - Postgres交叉表并汇总在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41354843/

10-12 19:34