выбрать из выбрать postgres - PullRequest
0 голосов
/ 13 марта 2019

У меня есть запрос, подобный этому

SELECT trx.store, trx.sales, trx.qty_sold, trx.average, trx.start_date, trx.end_date, stok.stok_qty
FROM
(select sto.name as store, sum(odi.subtotal_price) as sales, sum(odi.qty) as qty_sold, ((sum(odi.subtotal_price))/(sum(odi.qty))) as average, 
    min(CAST(ord.date_out AS date)) as start_date, max(CAST(ord.date_out AS date)) as end_date 
from trx_order_detail_item odi
left join trx_order as ord on ord.id = odi.order_id
left join mst_store as sto on sto.id = ord.store_id
where sto.principle_id = 12 and ord.date_out between '2018-07-01' and '2019-02-28' 
    and ord.order_status_id in (select mst_order_status.id from mst_order_status where mst_order_status.id = 3 or mst_order_status.id = 5) 
    and ord.void_status=0
group by sto.name, date_trunc('month', ord.date_out)
order by date_trunc('month', ord.date_out)) AS trx, 
(select sum(siss.jumlah_akhir) as stok_qty
from trx_stok_item_summary as siss 
where siss.input_date IN (select max(sisss.input_date)
            from trx_stok_item_summary as sisss
            join mst_store as sto on sto.id = sisss.store_id
            join mst_item as it on it.id = sisss.item_id
            join mst_item_classifiers as ic on ic.id = sisss.item_variant_id
            where sto.principle_id = 12 and input_date between '2018-07-01' AND  '2019-02-28'
            group by date_trunc('month', sisss.input_date), sisss.item_variant_id
            order by date_trunc('month', sisss.input_date))
group by date_trunc('month', siss.input_date)) AS stok

, и вывод равен

Store  |Sales |qty_sold|average |start_date  |end_date    |stok_qty 
===================================================================
Store 1|494000|128     |3859.375|"2018-07-02"|"2018-07-31"|-263
Store 1|494000|128     |3859.375|"2018-07-02"|"2018-07-31"|0
Store 1|327000|44      |7431.818|"2018-08-01"|"2018-08-19"|-263
Store 1|327000|44      |7431.818|"2018-08-01"|"2018-08-19"|0

, и когда я продляю дату, результат зацикливается столько, сколько сколько месяцев в данныхrange.

И вывод, который мне нужен:

Store  |Sales |qty_sold|average |start_date  |end_date    |stok_qty 
===================================================================
Store 1|494000|128     |3859.375|"2018-07-02"|"2018-07-31"|-263
Store 1|327000|44      |7431.818|"2018-08-01"|"2018-08-19"|0

Есть идеи, как это исправить?

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Вам не хватает каких-либо критериев объединения, попробуйте:

SELECT trx.store, trx.sales, trx.qty_sold, trx.average, trx.start_date, trx.end_date, stok.stok_qty
FROM
(select sto.name as store, sum(odi.subtotal_price) as sales, sum(odi.qty) as qty_sold, ((sum(odi.subtotal_price))/(sum(odi.qty))) as average, 
    min(CAST(ord.date_out AS date)) as start_date, max(CAST(ord.date_out AS date)) as end_date,
date_trunc('month', ord.date_out) AS trx_month
from trx_order_detail_item odi
left join trx_order as ord on ord.id = odi.order_id
left join mst_store as sto on sto.id = ord.store_id
where sto.principle_id = 12 and ord.date_out between '2018-07-01' and '2019-02-28' 
    and ord.order_status_id in (select mst_order_status.id from mst_order_status where mst_order_status.id = 3 or mst_order_status.id = 5) 
    and ord.void_status=0
group by sto.name, date_trunc('month', ord.date_out)
order by date_trunc('month', ord.date_out)) AS trx, 
(select date_trunc('month', siss.input_date) AS stok_month,
sum(siss.jumlah_akhir) as stok_qty
from trx_stok_item_summary as siss 
where siss.input_date IN (select max(sisss.input_date)
            from trx_stok_item_summary as sisss
            join mst_store as sto on sto.id = sisss.store_id
            join mst_item as it on it.id = sisss.item_id
            join mst_item_classifiers as ic on ic.id = sisss.item_variant_id
            where sto.principle_id = 12 and input_date between '2018-07-01' AND  '2019-02-28'
            group by date_trunc('month', sisss.input_date), sisss.item_variant_id
            order by date_trunc('month', sisss.input_date))
group by date_trunc('month', siss.input_date)) AS stok
WHERE stok.stok_month = trx.trx_month
0 голосов
/ 13 марта 2019

Использование distinct on:

select distinct on (store, start_date) . . .
<rest of your query here>
order by store, start_date, stok_qty;
0 голосов
/ 13 марта 2019

использование distinct

SELECT distinct trx.store, trx.sales, trx.qty_sold, trx.average, trx.start_date, trx.end_date, stok.stok_qty
FROM
(select sto.name as store, sum(odi.subtotal_price) as sales, sum(odi.qty) as qty_sold, ((sum(odi.subtotal_price))/(sum(odi.qty))) as average, 
    min(CAST(ord.date_out AS date)) as start_date, max(CAST(ord.date_out AS date)) as end_date 
from trx_order_detail_item odi
left join trx_order as ord on ord.id = odi.order_id
left join mst_store as sto on sto.id = ord.store_id
where sto.principle_id = 12 and ord.date_out between '2018-07-01' and '2019-02-28' 
    and ord.order_status_id in (select mst_order_status.id from mst_order_status where mst_order_status.id = 3 or mst_order_status.id = 5) 
    and ord.void_status=0
group by sto.name, date_trunc('month', ord.date_out)
order by date_trunc('month', ord.date_out)) AS trx, 
(select sum(siss.jumlah_akhir) as stok_qty
from trx_stok_item_summary as siss 
where siss.input_date IN (select max(sisss.input_date)
            from trx_stok_item_summary as sisss
            join mst_store as sto on sto.id = sisss.store_id
            join mst_item as it on it.id = sisss.item_id
            join mst_item_classifiers as ic on ic.id = sisss.item_variant_id
            where sto.principle_id = 12 and input_date between '2018-07-01' AND  '2019-02-28'
            group by date_trunc('month', sisss.input_date), sisss.item_variant_id
            order by date_trunc('month', sisss.input_date))
group by date_trunc('month', siss.input_date)) AS stok
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...