Как объединить множественные запросы, приводящие к одному результату запроса

#sql #postgresql #count #sum #pivot

#sql #postgresql #количество #сумма #сводная

Вопрос:

я буду очень признателен, если вы поможете нам в следующей теме :

 select z1.nature_projet as typeCredit,COUNT(z1.nature_projet) as nbreTotalRejete, SUM(z1.montant_emprunt) as totalMontantRejete                                                 
FROM (
select * from dossier
where (EXTRACT(MONTH FROM date_affectation_banque ) = EXTRACT(MONTH FROM now())) and partner_id=1 and statut_dossier='Envoye'
) z1
where banque_statut_dossier='Rejete'
group by nature_projet**
  

На следующем рисунке описан результат :

введите описание изображения здесь

 select  z1.nature_projet as typeCredit,COUNT(z1.nature_projet) as nbreTotalAccorde, SUM(z1.montant_emprunt) as totalMontantAccorde                                                          
FROM (
select * from dossier
where (EXTRACT(MONTH FROM date_affectation_banque ) = EXTRACT(MONTH FROM now())) and partner_id=1 and statut_dossier='Envoye'
) z1
where banque_statut_dossier='Accorde'
group by nature_projet
  

на следующем рисунке описан результат :

введите описание изображения здесь

 SELECT z1.nature_projet as typeCredit,  
COUNT(z1.nature_projet) as nbreTotal, SUM(z1.montant_emprunt) as totalMontant                                                           
FROM (
select * from dossier
where (EXTRACT(MONTH FROM date_affectation_banque ) = EXTRACT(MONTH FROM now())) and partner_id=1 and statut_dossier='Envoye'
) z1
group by nature_projet
  

на следующем рисунке описан результат :

введите описание изображения здесь

я хочу объединить результат первых двух запросов в один результат последнего, чтобы результирующие СТОЛБЦЫ были похожи :

 TypeCredit,totalNbre,totalMontant,TotalNbreAccorde,TotalMontantAccorde,TottalNbreRejete,TotalMontantRejete
  

Ответ №1:

Вы можете выполнить условную агрегацию. Рассмотрим:

 select nature_projet, 
    count(*)             filter(where banque_statut_dossier = 'Rejete' ) cnt_rejete,
    count(*)             filter(where banque_statut_dossier = 'Accorde') cnt_accorde,
    count(*)             filter(where banque_statut_dossier = 'Envoye' ) cnt_envoye,
    sum(montant_emprunt) filter(where banque_statut_dossier = 'Rejete' ) montant_rejete,
    sum(montant_emprunt) filter(where banque_statut_dossier = 'Accorde') montant_accorde,
    sum(montant_emprunt) filter(where banque_statut_dossier = 'Envoye' ) montant_envoye
from dossier
where 
    partner_id = 1
    and banque_statut_dossier in ('Rejete', 'Accorde', 'Envoye')
    and date_affectation_banque >= date_trunc('month', current_date) 
    and date_affectation_banque <  date_trunc('month', current_date)   interval '1 month'
group by nature_projet
  

Обратите внимание, что я изменил логику фильтрации по дате; похоже, вы намерены фильтровать по текущему месяцу, и приведенные выше выражения, использующие прямую фильтрацию по полуоткрытым интервалам, делают это более эффективно, чем ваша исходная стратегия, которая опирается на функции даты.