如何在特定条件下合并行 postgres Sql
How to combine rows under certain conditions postgres Sql
我有一个问题。下面是我的 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.
您可以将现有查询转换为 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
子句中使用逗号);这是几十年前的旧语法,不应该出现在新代码中。相反,您应该使用标准的显式连接(使用 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
你可以用它的案例。
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;
编辑:您也可以使用 coalesce()。即:
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;
我有一个问题。下面是我的 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.
您可以将现有查询转换为 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
子句中使用逗号);这是几十年前的旧语法,不应该出现在新代码中。相反,您应该使用标准的显式连接(使用 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
你可以用它的案例。
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;
编辑:您也可以使用 coalesce()。即:
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;