как сделать запрос
есть таблица следующего вида:
запрос должен отобразить все движения на складе, за это отвечает столбец "Movement_Type" (1 -товар прибыл, 0 убыл)
| "Date" | "Point_ID" | "tovar" | "Movement_Type" | "Sum_upack" | "tovar_Value" |
|---|---|---|---|---|---|
| 2021-04-10 | склад1 | огурцы | 1 | 2.0 | 100.0 |
| 2021-04-10 | склад2 | огурцы | 1 | 2.0 | 100.0 |
| 2021-04-10 | склад3 | огурцы | 1 | 2.0 | 100.0 |
| 2021-04-10 | склад1 | помидоры | 1 | 2.0 | 200.0 |
| 2021-04-10 | склад2 | помидоры | 1 | 2.0 | 200.0 |
| 2021-04-10 | склад3 | груши | 1 | 4.0 | 150.0 |
| 2021-04-10 | склад2 | огурцы | 0 | 1.0 | 100.0 |
| 2021-04-10 | склад3 | огурцы | 0 | 2.0 | 100.0 |
| 2021-05-10 | склад1 | огурцы | 0 | 2.0 | 100.0 |
| 2021-05-10 | склад2 | огурцы | 1 | 3.0 | 100.0 |
| 2021-05-10 | склад1 | огурцы | 0 | 3.0 | 100.0 |
| 2021-05-10 | cклад3 | груши | 0 | 2.0 | 150.0 |
| 2021-05-10 | cклад2 | помидоры | 0 | 2.0 | 150.0 |
| 2021-05-10 | cклад1 | помидоры | 0 | 2.0 | 150.0 |
| 2021-05-10 | cклад1 | огурцы | 1 | 4.0 | 150.0 |
| 2021-06-10 | cклад1 | сливы | 1 | 4.0 | 150.0 |
| 2021-06-10 | cклад1 | сливы | 1 | 4.0 | 150.0 |
| 2021-07-10 | cклад1 | сливы | 1 | 2.0 | 150.0 |
| 2021-07-10 | cклад1 | сливы | 1 | 2.0 | 150.0 |
| 2021-08-10 | cклад1 | сливы | 0 | 2.0 | 150.0 |
| 2021-08-10 | cклад1 | сливы | 0 | 2.0 | 150.0 |
Собственно, 2 временные таблицы которые считают прибытие и убытие товаров со склада, после чего объединяется join ом
Сам запрос:
with prib as (select distinct date,
"Point_ID",
"tovar",
sum("Sum_upack") over (partition by date,"Point_ID","tovar") as prixod,
count(*) over (partition by date,"Point_ID","tovar") as count_prixod,
sum(sum_prixod) over (partition by date,"Point_ID","tovar") as rich
from (select to_date ("Date",'YYYY-MM-DD') as date ,
"Point_ID" ,
"tovar",
"Sum_upack",
"tovar_Value" as sum_prixod
from test_table_12
where "Movement_Type"=1) as a_1
order by 1,2,3),
ub as (select distinct date,
"Point_ID",
"tovar",
sum("Sum_upack") over (partition by date,"Point_ID","tovar") as rasxod,
count(*) over (partition by date,"Point_ID","tovar") as count_rasxod,
sum(sum_prixod) over (partition by date,"Point_ID","tovar") as ubyt,
from (select to_date ("Date",'YYYY-MM-DD') as date ,
"Point_ID" ,
"tovar",
"Pack_Sum",
"tovar_Value" as sum_prixod
from test_table_12
where "Movement_Type"=0) as a_2
order by 1,2,3)
select prib.date,
prib."Point_ID",
prib."tovar",
prib.prixod,
ub.rasxod,
prib.rich,
ub.ubyt,
coalesce (prib.prixod,0) - coalesce (ub.rasxod,0) as end_day
from prib
left outer join ub on prib.date = ub.date and prib."Point_ID" = ub."Point_ID" and prib."Point_ID" = ub."Point_ID"
результат работы следующий:
| "date" | "Point_ID" | "tovar" | prixod | rasxod | rich | ubyt | end_day |
|---|---|---|---|---|---|---|---|
| 2021-04-10 | склад1 | огурцы | 2.0 | NULL | 100.0 | NULL | 2.0 |
| 2021-04-10 | склад1 | помидоры | 2.0 | NULL | 200.0 | NULL | 2.0 |
| 2021-04-10 | склад2 | огурцы | 2.0 | 1.0 | 100.0 | 100.0 | 1.0 |
| 2021-04-10 | склад2 | помидоры | 2.0 | 1.0 | 200.0 | 100.0 | 1.0 |
| 2021-04-10 | склад3 | груши | 4.0 | 2.0 | 150.0 | 100.0 | 2.0 |
| 2021-04-10 | склад3 | огурцы | 2.0 | 2.0 | 100.0 | 100.0 | 0.0 |
| 2021-05-10 | cклад1 | огурцы | 4.0 | 2.0 | 150.0 | 150.0 | 2.0 |
| 2021-05-10 | склад2 | огурцы | 3.0 | NULL | 100.0 | NULL | 3.0 |
| 2021-06-10 | cклад1 | сливы | 8.0 | NULL | 300.0 | NULL | 8.0 |
| 2021-07-10 | cклад1 | сливы | 4.0 | NULL | 300.0 | NULL | 4.0 |
все бы хорошо, но в исходной таблице есть 2 последние записи с датой 2021-08-10 где показывается что товар убыл, ожидаю что в конце 2 таблице должна быть следующая строка:
| "date" | "Point_ID" | "tovar" | prixod | rasxod | rich | ubyt | end_day |
|---|---|---|---|---|---|---|---|
| 2021-08-10 | cклад1 | сливы | NULL | 4.0 | NULL | 300.0 | 4.0 |
на end_day не обращайте внимание -это промежуточный столбец.
Я так понимаю что то с join надо сделать,я попробовал все - NULL выскакивает не там где надо
Ответы (1 шт):
Автор решения: Alexander Pavlov
→ Ссылка
select
date,
"Point_ID",
"tovar",
sum(case MovementType when 0 then Sum_upack else 0 end) rasxod,
sum(case MovementType when 1 then Sum_upack else 0 end) prixod,
sum(case MovementType when 1 then Sum_upack else -Sum_upack end) end_day
from
test_table_12
group by
date,"Point_ID","tovar"
order by
date,"Point_ID","tovar"