2016-07-28 13 views
1

Ich habe 2 TabellenMehrere Auswahlabfrage postgresql mit

TABLE_A

id b_ref_id qty 
52 9   13 
53 10   20 
54 11   25 

Table_B

id method  date    state 
9 m1   28/07/16    confirmed 
10 m1   29/07/16    done 
11 m1   30/07/16    waiting 

Mein Wunsch Ausgang

m1   today tomorrow day_after_tomorrow 
waiting  13  0     0 
confirmed 0  20    0 
done  0  0     25 

ich folgende Abfrage versuchen, aber Menge ist Wiederholen Sie für alle

select stock_p.method, stock_p.state, 
(select sm.qty 
from 
    table_a sm 
    join table_b spo on (sm.b_ref_id=spo.id) 
where 
    to_char(spo.date,'YYYY-MM-DD')::date = current_date and) today_qty, 
(select sm.qty 
from table_a sm 
    join table_b spo on (sm.b_ref_id=spo.id) 
where 
    to_char(spo.date,'YYYY-MM-DD')::date = (current_date + 1)) tomorrow_qty, 
(select sm.qty 
from table_a sm 
    join table_b spo on (sm.b_ref_id=spo.id) 
    where 
    to_char(spo.date,'YYYY-MM-DD')::date = (current_date + 2)) next_three_qty 

von TABLE_A stock_m beitreten Table_B stock_p auf stock_m.b_ref_id = stock_p.id Gruppe von stock_p.method, stock_p.stateenter Code hier

+0

Danke für Update ... –

+1

Meiner Meinung nach versuchen Sie, zwei verschiedene Dinge hier zu tun. Es ist einfach, die gewünschten Daten zu erhalten. Es ist eine direkte Verknüpfung der beiden Tabellen. Was ist schwieriger ist der Drehpunkt, den Sie auf den Daten tun. Was oft am besten in einem anderen Tool gemacht wird. BTW die Abfrage scheint nicht mit den Tabellen übereinzustimmen. –

Antwort

1
select 
    t1.method, t1.status, 
    sum ((t1.min_date = current_date or null)::int * sm.product_qty) as today, 
    sum ((t1.min_date = current_date + 1 or null)::int * sm.product_qty) as tomorrow, 
    sum ((t1.min_date = current_date + 2 or null)::int * sm.product_qty) as day_after_tomorrow 
from 
    stock_move sm 
    inner join 
    table_1icking t1 on sm.picking_id = t1.id 
group by t1.method, t1.status 
; 
method | status | today | tomorrow | day_after_tomorrow 
--------+-----------+-------+----------+-------------------- 
m1  | waiting |  |   |     25 
m1  | done  |  |  20 |     
m1  | confirmed | 13 |   |     

Mit 9.4+ Verwendung filter wie kommentiert von @ein Pferd. Die Daten:

create table stock_move (id int, picking_id int, product_qty int); 
insert into stock_move (id, picking_id, product_qty) values 
(52,9,13), (53,10,20), (54,11,25); 
set datestyle = 'dmy'; 
create table table_1icking (id int, method text, min_date date, status text); 
insert into table_1icking (id, method, min_date, status) values 
(9,'m1','28/07/16','confirmed'), 
(10,'m1','29/07/16','done'), 
(11,'m1','30/07/16','waiting'); 
+0

Alternativ: 'sum (sm.qty) filter (wobei t1.date = current_date) wie heute ' –

+0

Hallo, danke für die Wiederholung. Ich habe versucht, aber seine Shows Menge ist 0 in allen Spalten. –

+0

@ user5668640 Funktioniert für mich. Überprüfen Sie die Aktualisierungsfrage mit Daten. –