2015-04-14 5 views
0

Как я могу объединить и обобщить агрегированные данные из двух таблиц A и B, если таблица B не имеет записи на ней. Я просто хочу показать нуль для всех записей в таблице A, которые не имеют соответствующих записей в таблице B с дополнительными критериями. В этом случае я хотел вернуть общее количество элементов, значение модели которых - «автомобили». Эта проблема возникает, когда таблица B пуста.SQL Join возвращает пустые записи

Вот мой фрагмент кода:

SELECT 10 as No,'Total' as Label, 
       SUM(CASE WHEN (a.year = b.year) THEN 1 ELSE 0 END) AS Value, 
       (a.Year) as Year 
FROM A a LEFT JOIN B b ON a.year = b.year 
WHERE (isDeleted = 0 OR isdeleted is null) and b.model='cars' 
GROUP BY a.year 
order by YearMonth asc 

ответ

1

Проблема здесь:

WHERE (isDeleted = 0 OR isdeleted is null) and b.model='cars' 

если b пусто, то b.model будет null, и ваше предложение wherefilter эти записи. Вы должны переместить это условие к вашей статье JOIN:

FROM A a LEFT JOIN B b ON a.year = b.year and b.model='cars' 
WHERE (isDeleted = 0 OR isdeleted is null) 

Обратите внимание, что ваш SUM может быть просто COUNT вместо поскольку нулевые значения не учитываются:

COUNT(b.year) AS Value, 
+0

Спасибо. Значение имеет что-то показать сейчас, но значение null отображается (a.Year) как Year. Любое решение? – aby

+0

У вас есть значения 'null' за год в' A'? Если да, то что вы хотите с ними делать? –

+0

Нет. У меня есть список значений года в A. A не может быть нулем вообще – aby

0

Move b.model = 'машины' из пункта WHERE в пункте ON (. В противном случае регулярное внутреннее соединение выполняется)

SELECT 10 as No, 
     'Total' as Label, 
     SUM(CASE WHEN (a.year = b.year) THEN 1 ELSE 0 END) AS Value, 
     (a.Year) as Year 
FROM A a LEFT JOIN B b ON a.year = b.year and b.model='cars' 
WHERE (isDeleted = 0 OR isdeleted is null) 
GROUP BY a.year 
order by YearMonth asc 
Смежные вопросы