#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:
Вы можете использовать условную агрегацию:
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