#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
Обратите внимание, что я изменил логику фильтрации по дате; похоже, вы намерены фильтровать по текущему месяцу, и приведенные выше выражения, использующие прямую фильтрацию по полуоткрытым интервалам, делают это более эффективно, чем ваша исходная стратегия, которая опирается на функции даты.