2016-08-17 1 views
-2

Я пытаюсь объединить некоторые показатели на основе дат. Проблема в том, что выбраны только даты с соответствующими ассоциациями get. Я хочу полный диапазон дат, с 0 для не соответствующих ассоциаций.Правильное соединение, не выбирая нуль

Я пытаюсь с этим

SELECT f2."day", coalesce(count(c0."id"), 0) 
FROM "conversations" AS c0 
LEFT OUTER JOIN "apps" AS a1 ON a1."id" = c0."app_id" 
RIGHT OUTER JOIN ((SELECT now()::date - d AS day FROM generate_series (0, 10) d)) AS f2 ON f2."day" = c0."inserted_at"::date 
WHERE (a1."id" = 'ASnYW1-RgCl0I') 
GROUP BY f2."day" 
+1

Вашего 'WHERE' оговорка исключает возможность каких-либо' NULL's из ваших 'приложений таблицу. – Nicarus

+0

http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

ответ

3

Сделайте где положение часть условий соединения вместо этого. Ниже код поворачивает левое соединение в приложениях к внутреннему соединению

SELECT f2."day", coalesce(count(c0."id"), 0) 
FROM "conversations" AS c0 
LEFT OUTER JOIN "apps" AS a1 ON a1."id" = c0."app_id" 
RIGHT OUTER JOIN ((SELECT now()::date - d AS day FROM generate_series (0, 10) d)) AS f2 ON f2."day" = c0."inserted_at"::date 
WHERE (a1."id" = 'ASnYW1-RgCl0I') 
GROUP BY f2."day" 

Этот код не делает:

SELECT f2."day", coalesce(count(c0."id"), 0) 
FROM "conversations" AS c0 
LEFT OUTER JOIN "apps" AS a1 ON a1."id" = c0."app_id" and (a1."id" = 'ASnYW1-RgCl0I') 
RIGHT OUTER JOIN ((SELECT now()::date - d AS day FROM generate_series (0, 10) d)) AS f2 ON f2."day" = c0."inserted_at"::date 
GROUP BY f2."day" 
+1

Вы также можете использовать 'WHERE (coalece (a1." Id ", 'ASnYW1-RgCl0I') = 'ASnYW1-RgCl0I')' – Hogan

Смежные вопросы