PostgreSQL – подсчет данных как ноль, если он равен нулю (когда используется предложение where)

Теперь у меня есть этот запрос:

SELECT opp.name as name, count(log.stage_id) as stage_count FROM crm_lead as opp LEFT OUTER JOIN crm_lead_stage_log as log ON (opp.id = log.opportunity_id) GROUP BY name 

И он выводит этот результат:

 name | stage_count | name1 | 2 name2 | 1 name3 | 0 

И он выводит то, что мне нужно. Но если я приложил к нему какое-либо условие, он пропускает строки с нулевым числом, которое мне нужно уметь видеть. Например, если я напишу этот запрос:

 SELECT opp.name as name, count(log.stage_id) as stage_count FROM crm_lead as opp LEFT OUTER JOIN crm_lead_stage_log as log ON (opp.id = log.opportunity_id) WHERE WHEN log.create_date > '2014-01-28 08:49:03' GROUP BY name 

Затем он выводит это:

 name | stage_count | name1 | 1 

Он правильно подсчитывает количество существующих этапов в этом временном интервале, но пропускает строки, число ступеней которых не существует во время inerval. Как я могу сделать вывод таким образом (в этом примере только один этап для первой строки подсчитывается за этот интервал времени с новым запросом, для других строк он считается нулевым, поскольку он не существует):

 name | stage_count | name1 | 1 name2 | 0 name3 | 0 

Можно ли так это сделать? PS, если требуется дополнительная информация, например, чтобы поставить этот запрос в Интернете, чтобы проверить его, просто напишите комментарий, и я обновлю свой ответ).

Ваше условие на внешней объединенной таблице превращает внешнее соединение во внутреннее соединение (поскольку «несуществующие строки будут иметь значение NULL а сравнение NULL с чем-то еще дает« неопределенный »и, таким образом, удалит эту строку из результата )

Вам нужно переместить это условие в условие соединения:

 SELECT opp.name as name, count(log.stage_id) as stage_count FROM crm_lead as opp LEFT JOIN crm_lead_stage_log as log ON opp.id = log.opportunity_id AND log.create_date > '2014-01-28 08:49:03' GROUP BY name; 

Если вы хотите вернуть ноль, когда результат равен нулю, вы можете использовать comand COALESCE.

 SELECT opp.name AS name, COALESCE(COUNT(log.stage_id)),0) AS stage_count FROM crm_lead AS opp LEFT OUTER JOIN crm_lead_stage_log AS log ON (opp.id = log.opportunity_id) GROUP BY name 

Он возвращает «0», когда count получает нулевое значение.