Количество, кроме нулей

#postgresql

#postgresql

Вопрос:

Как я могу подсчитать количество записей, в которых нули не учитываются?

 SELECT c.id AS Id
        ,c.A AS A
        ,sum(phtd.RealCol1) / 3600 AS RealCol1
        ,CAST(count(phtd.RealCol1) AS DECIMAL) AS RealCol2
    FROM ubdr
    INNER JOIN cfg c ON (ubdr.B = c.id)
    INNER JOIN per_historico phtd ON (
            phtd.B = ubdr.B
            AND ubdr.D = phtd.D
            )
    INNER JOIN per_t pt ON (phtd.T= pt.id)
    INNER JOIN per_p pa ON (pa.T= pt.id)
    WHERE 1 = 1
    GROUP BY 1
        ,2
 

Я написал это CAST(count(phtd.RealCol1) AS DECIMAL) AS RealCol2 , но это количество также подсчитывает нули. Как я могу добиться подсчета записей без подсчета нулей? Я имею в виду подсчет записей, отличных от нуля

Ответ №1:

демонстрации: db<>скрипка

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

 COUNT(phtd.RealCol1) FILTER (WHERE phtd.RealCol1 <> 0)
 

Вместо FILTER предложения using вы можете использовать условное SUM выражение, используя CASE предложение:

 SUM(
   CASE WHEN phtd.RealCol1 = 0 THEN 0 ELSE 1 END
)
 

Это может быть оптимизировано для:

 SUM((phtd.RealCol1 <> 0)::int)
 

Ответ №2:

Вместо CAST(count(phtd.RealCol1) AS DECIMAL) AS RealCol2 этого вы можете использовать SUM :

CAST(SUM( CASE WHEN phtd.RealCol1 > 0 THEN 1 ELSE 0 END ) AS DECIMAL) AS RealCol2

или вы можете использовать FILTER :

CAST((COUNT(phtd.RealCol1) FILTER (WHERE phtd.RealCol1 > 0)) AS DECIMAL) AS RealCol2