【问题标题】:How to combine rows under certain conditions postgres Sql如何在某些条件下合并行postgresql
【发布时间】:2020-04-15 23:13:09
【问题描述】:

我有一个问题。下面是我的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

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

如果有人可以帮忙,请。

溴 R.

【问题讨论】:

  • 你熟悉JOIN吗?你应该使用它。

标签: sql postgresql group-by count rows


【解决方案1】:

你可以用它。

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;

【讨论】:

  • 这个可行,但在 st_vseh_primerov 的结果为空的情况下,它应该将其视为零。如何做到这一点?
  • 谢谢,我可以再问一个问题吗?为什么是 st_aktivnih max 而不是 sum? st_aktivnih 也应该总结为与 st_vseh_primerov 和 glavnica_vseh_primerov 相同。
  • 我只是将 max 校正为 sum 并擦除“
【解决方案2】:

您可以将现有查询转换为 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

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2022-01-02
    • 1970-01-01
    • 2021-04-11
    • 2022-12-17
    • 2020-06-13
    相关资源
    最近更新 更多