2016-12-28 2 views
0

Ich habe eine Tabelle purchases wie folgt aus:Postgres Kreuztabellen- und aggregieren zusammen

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 

und eine Tabelle products wie folgt aus:

product_id 
    17 
    18 
    19 
    ... About 30 entries 

Ich möchte eine Kreuztabellenabfrage tun mir die geben Gesamtzahl der Einkäufe am Tag, geschwenkt über jede Produkt-ID:

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

Hinweis th bei den Werten in dieser Tabelle sind nicht aus einem Datensatz, aber die Summe der Anzahl der Datensätze, die übereinstimmen. Ich glaube, dies ist möglich mit crosstab zusammen mit Aggregaten, aber nicht in der Lage gewesen, herauszufinden, wie es geht.

  1. Kann dies mit Postgres gemacht werden?
  2. Ist die Kreuztabelle der richtige Weg?
  3. Wie?

Was hier einzigartig ist, dass ich versuche:

  • Sie einen Kreuztabellen-
  • ein Aggregat

Beachten Sie, dass die anderen Fragen zur gleichen Zeit tun Stapelüberlauf, in dem Kreuztabellen diskutiert werden, erklären nicht, wie ein Kreuztabellenpaar erstellt und zusammengefügt wird.

+0

Mögliche Duplikat [PostgreSQL Query-Crosstab] (http://stackoverflow.com/questions/3002499/postgresql-crosstab-query) – GurV

+0

@GurwinderSingh Edited den Unterschied zu verdeutlichen – SRobertJames

Antwort

1

mit als Probe nach

Table-

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

Data-

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); 

Um die gewünschte Ausgabe erhalten Sie können 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 
     ) 

Output-

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