Поместите ваш запрос в CTE
и затем используйте выражение CASE
, чтобы выбрать 2 столбца:
with cte as (
select s.nom_ , sum(o.soni_) as soni_ ,
sum(o.soni_*(select narx_ from toper where id_=o.id_ )) as savdo_,
sum((o.soni_*o.narx_-o.soni_* (select narx_ from toper where id_=o.id_op ))) as foyda_,
(select nom_ from tsinf where id_=o.id_v) as val_
from toper o left join tsf f on o.id_sf=f.id_
left join tsinf s on o.id_s=s.id_
where (f.date_>=date('2020-01-01')) and (f.date_<=date('2020-04-04'))
and f.oper_=-1
group by id_s, id_v
)
select nom_, soni, savdo, foyda_,
case when val_ = 'UZS' then val_ end as Val1,
case when val_ = 'USD' then val_ end as Val2
from cte
Но вы должны знать, что условие:
where (f.date_>=date('2020-01-01')) and (f.date_<=date('2020-04-04'))
изменяет ваше left
объединение на tsf
на inner
присоединение. Если результаты того, что вы ожидаете, то хорошо. Если нет, переместите эти условия в предложение ON
. Также вместо всех операторов select
, которые вы используете в списке выбора, вы можете использовать joins
, если отношения 1: 1. Попробуйте это:
select
s.nom_,
sum(o.soni_) as soni_,
sum(o.soni_* o2.narx_) as savdo_,
sum((o.soni_*o.narx_-o.soni_* o3.narx_) as foyda_,
case when s2.nom_ = 'UZS' then s2.nom_ end as Val1,
case when s2.nom_ = 'USD' then s2.nom_ end as Val2
from toper o
left join toper o2 on o2.id_=o.id_
left join toper o3 on o3.id_=o.id_op
left join tsf f on o.id_sf=f.id_
left join tsinf s on o.id_s=s.id_
left join tsinf s2 on o.id_v=s2.id_
where (f.date_>=date('2020-01-01')) and (f.date_<=date('2020-04-04')) and f.oper_=-1
group by id_s, id_v