2015-06-16 4 views
0

У меня есть таблица CITY_PEOPLE с CITYNAME и peopleName как два имен столбцов и другая таблица PEOPLE_ALIVE с именами столбцов peopleName и aliveStatusSQL необходимо, чтобы получить результаты с нулевыми значениями

aliveStatus может иметь Y или N

Я хочу чтобы получить количество людей, живых в городе и название города

с ниже запроса, я могу получить счетчик, если число> 0

SELECT cityName, count(*) noOfPeopleAlive 
FROM CITY_PEOPLE b 
WHERE peopleName in (SELECT peopleName FROM PEOPLE_ALIVE where aliveStatus='Y') 
GROUP BY b.cityName 

, но я хочу иметь список городов с count = 0. Как я могу получить ?

+2

Является peopleName первым и фамилия? Откуда вы знаете, что у вас не будет 2 «Джон Смит» в одном городе? – alybaba726

ответ

1

Использовать Left Join.

SELECT cityName, count(p.peopleName) noOfPeopleAlive 
FROM CITY_PEOPLE b 
LEFT JOIN PEOPLE_ALIVE p 
ON p.peopleName = b.peopleName 
AND p.aliveStatus = 'Y' 
group by b.cityName 

Также обратите внимание: Просто глядя на ваш запрос, если вы присоединяетесь на имя человека, это довольно часто, чтобы люди с таким же названием, который собирается сделать вашу жизнь трудной.

+0

Это не работает; 'count (*)' будет возвращать 1 для городов без людей, потому что он не различает случаи, когда есть запись в 'p' и те, где их нет. –

+0

Не могли бы вы просто посчитать (peopleName) '? Если в городе нет людей, то это вернет 0. – Adam

+3

Возможно, вам понадобится «count (p.peoplename) noOfPeopleAlive» – Tim3880

1

Левое внешнее соединение будет решить вашу проблему

SELECT cityName, count(*) noOfPeopleAlive 
FROM CITY_PEOPLE b 
LEFT OUTER JOIN PEOPLE_ALIVE p 
ON p.peopleName = b.peopleName 
AND p.aliveStatus = 'Y' 
GROUP BY b.cityName 
1

Weird структуру таблицы, но это будет работать:

select 
    C.cityName, 
    noOfPeopleAlive = sum(case P.aliveStatus when 'Y' then 1 else 0 end) 
from 
    CITY_PEOPLE C 
    left join PEOPLE_ALIVE P on C.peopleName = P.peopleName 
group by 
    C.cityName; 
Смежные вопросы