Как объединить строки при определенных условиях postgres Sql - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть вопрос. Ниже мой sql.

SELECT upniki.naziv,
        (
            SELECT count(caseid) 
            FROM terjatve, paket 
            WHERE terjatve.stevilkapaketa=paket.id_paket
            AND terjatve.idnarocnik=upniki.id_upnik
            AND paket.datum_predaje >='1900-03-01'
            AND paket.datum_predaje <='2020-03-31' 
            GROUP BY upniki.naziv) as st_vseh_primerov,
        (
            SELECT sum(racuni.startsum) 
            FROM racuni, paket, terjatve 
            WHERE terjatve.stevilkapaketa=paket.id_paket 
            AND terjatve.caseid=racuni.caseid
            AND terjatve.idnarocnik=upniki.id_upnik 
            AND paket.datum_predaje >='1900-03-01'
            AND paket.datum_predaje <='2020-03-31' 
            GROUP BY upniki.naziv) as glavnica_vseh_primerov,
        (
            SELECT count(caseid) 
            FROM terjatve, paket 
            WHERE terjatve.stevilkapaketa=paket.id_paket 
            AND terjatve.idnarocnik=upniki.id_upnik 
            AND paket.datum_predaje >='1900-03-01' 
            AND paket.datum_predaje <='2020-03-31'
            AND terjatve.statusnacinid='1' 
            GROUP BY upniki.naziv) as st_aktivnih
FROM upniki 
GROUP BY upniki.naziv, upniki.id_upnik

С этим SQL я получаю результат следующим образом.

naziv     st_vseh_primerov  glavnica_vseh_primerov  st_aktivnih
CLIENT 1       12                      7500                  0
CLIENT 2       10                     40000                  0
CLIENT 3       15                      5000                  0
CLIENT 4       16                     15000                  0
CLIENT 5        9                     12000                  0
CLIENT 6        8                     60000                  1
CLIENT 7        4                      3000                  0
CLIENT 8        3                     10000                  0

В результате мне нужно объединить строки, в которых st_vseh_primerov < = 10 в один ряд. Строки, являющиеся предметом объединения, больше не будут показаны. Итак, результат должен быть таким:

naziv      st_vseh_primerov     glavnica_vseh_primerov      st_aktivnih
CLIENT 1          12                            7500              0
CLIENT 3          15                            5000              0
CLIENT 4          16                           15000              0
SME               34                          125000              1

Пожалуйста, если кто-нибудь может помочь.

Br R.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вы можете использовать case для него.

select case when ( st_vseh_primerov is null or st_vseh_primerov <= 10 ) then 'SME' else naziv end as naziv,
       sum(st_vseh_primerov) as st_vseh_primerov,
       sum(glavnica_vseh_primerov) as glavnica_vseh_primerov,
       max(case when ( st_vseh_primerov is null or st_vseh_primerov <= 10 ) then 1 else 0 end) as st_aktivnih
from ( < your select above ) tmp
group by case when ( st_vseh_primerov is null or st_vseh_primerov <= 10 ) then 'SME' else naziv end;

EDIT: Вы также можете использовать coalesce (). ie:

select case when coalesce( st_vseh_primerov,0) <= 10  then 'SME' else naziv end as naziv,
       sum(st_vseh_primerov) as st_vseh_primerov,
       sum(glavnica_vseh_primerov) as glavnica_vseh_primerov,
       max(case when coalesce( st_vseh_primerov,0) <= 10 then 1 else 0 end) as st_aktivnih
from ( < your select above ) tmp
group by case when coalesce( st_vseh_primerov,0) <= 10 then 'SME' else naziv end;
0 голосов
/ 16 апреля 2020

Вы можете превратить ваш существующий запрос в cte или подзапрос и агрегировать во внешнем запросе:

with cte as (... your query here ...)
select
    case when c.st_vseh_primerov <= 10 
        then 'SME'
        else c.naviz
    end naviz,
    SUM(st_vseh_primerov) st_vseh_primerov,
    SUM(glavnica_vseh_primerov) glavnica_vseh_primerov,
    SUM(st_aktivnih) st_aktivnih
from cte c
group by
    case when c.st_vseh_primerov <= 10 
        then 'SME'
        else c.naviz
    end

Обратите внимание, что вы не должны использовать неявные объединения (с запятыми в предложении from) ; это старый синтаксис из десятилетий go, который не должен появляться в новом коде. Вместо этого вы должны использовать стандартные явные объединения (с ключевым словом on). В общем, что-то вроде этого (исходя из вашего первого подзапроса):

FROM terjatve, paket 
WHERE 
    terjatve.stevilkapaketa=paket.id_paket
    AND terjatve.idnarocnik=upniki.id_upnik

Должно быть написано:

FROM terjatve
INNER JOIN paket ON terjatve.stevilkapaketa=paket.id_paket
WHERE terjatve.idnarocnik=upniki.id_upnik
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...