![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменить SQL запрос, что бы и пустые записи тоже были? [D7, MSSQL]
Draught © (2004-05-26 14:36:00)есть SQL запрос:
select HOTEL, count(NUMBER) from number
where FINDATE>'26.05.2004'
GROUP BY HOTEL
получается таблица
HOTEL | COUNT OF NUMBER
1 | 5
3 | 10
далее эти данные загоняются в график
вроде все понятно, но вот столкнулся с ситуацией, когда полю HOTEL соответствует 0 записей, соответственно это не отображается, а хотелось бы, т.е. что бы было так
HOTEL | COUNT OF NUMBER
1 | 5
3 | 10
5 | 0
Sandman25+1 (2004-05-26 16:50:00) [21]Точнее, вот так:
select hotel, (select count(number) from number where number.hotel=h.hotel
and FINDATE>'26.05.2004')
from hotel h
И не надо так нервничать. Если автор хочет мучиться, никто ему этого не запретит.
Соловьев (2004-05-26 16:48:00) [22]select hotel, (select count(number) from number where number.hotel=h.hotel)
from hotel h
where FINDATE>'26.05.2004'
работает???
Draught (2004-05-26 16:41:00) [23]вообщем не работет все-равно
вариант остается с обычным GRID'ом
Johnmen (2004-05-26 16:27:00) [24]+ см. [4]
Sandman25+1 (2004-05-26 16:26:00) [25][11] Соловьев © (26.05.04 16:16)
Конечно, работает. Причем должно даже быстрее работать.
[12] Draught © (26.05.04 16:22)
select HOTEL.ID_hotel, count(*)
from HOTEL
left join NUMBER on HOTEL.ID_hotel=NUMBER.hotel and
FINDATE>'26.05.2004'
GROUP BY HOTEL.ID_hotel
Draught (2004-05-26 16:26:00) [26]млин, уже запарился...
счас простой GRID добавлю, в котором будут все записи из таблицы HOTEL и заполню его данными из запроса, т.е. соответствующему HOTEL сопоставлю количество NUMBER... а все, что в запросе будет отсутствовать будет нулевым... :-D
Draught (2004-05-26 16:22:00) [27]так, немного поменят в табличке HOTEL, что бы не путаться, теперь поле HOTEL наз-ся ID_HOTEL
запрос изменился
select HOTEL.ID_hotel, count(*)
from HOTEL
left join NUMBER on HOTEL.ID_hotel=NUMBER.hotel
where FINDATE>'26.05.2004'
GROUP BY HOTEL.ID_hotel
опять же показывает только те записи, для которых есть хотя бы одна запись в таблице NUMBER удовлетворяющая условию FINDATE>'26.05.2004', если убрать строку where FINDATE>'26.05.2004'то показывает все записи... но условие при этом не обрабатывается
Соловьев (2004-05-26 16:16:00) [28]
> [10] Draught © (26.05.04 15:53)
[8] - не работает?
Draught (2004-05-26 15:53:00) [29]2Johnmen
а расписать немного поподробнее можно??? т.е. где что означает
особенно меня интересует
left join NUMBER on HOTEL.hotel=NUMBER.hotel
это мне немного непонятно
и
select HOTEL.hotel, count(*)
from hotel
последнее я так понимаю выборка всех записей HOTEL из таблицы HOTEL, но зачем там count(*)?
Johnmen (2004-05-26 15:21:00) [30]
select HOTEL.hotel, count(*)
from HOTEL
left join NUMBER on HOTEL.hotel=NUMBER.hotel
where FINDATE>'26.05.2004'
GROUP BY HOTEL.hotel
Соловьев (2004-05-26 15:12:00) [31]
> [5] Draught © (26.05.04 14:59)
select hotel, (select count(number) from number where number.hotel=h.hotel)
from hotel h
Draught (2004-05-26 15:03:00) [32]2Sandman25+1, да-да, похоже что надо HOTEL брать из другой таблицы...
Соловьев (2004-05-26 14:59:00) [33]а почему не
HAVING count(NUMBER) > =0
Draught (2004-05-26 14:59:00) [34]Так похоже немного непонятно задал вопрос:
Есть 2 таблицы, главная HOTEL и подчиненная NUMBER
в главной таблице есть поля HOTEL
в подчиненной HOTEL, NUMBER связь по HOTEL-->HOTEL (похоже одно из них нужно переименовать в ID_HOTEL)
для одного значения HOTEL существует несколько значений NUMBER, но может и ни одного значения не существовать
мне нужно сделать запрос, в котором будут ВСЕ ЗНАЧЕНИЯ HOTEL, даже если для них не существует ни одного значения в таблице NUMBER
я так понял нужно вообще другой запрос, т.е. выборку HOTEL делать из таблицы HOTEL, а NUMBER из NUMBER, что-то типа такого
select HOTEL, count(NUMBER) from HOTEL, NUMBER
where FINDATE>'26.05.2004'
GROUP BY HOTEL
Johnmen (2004-05-26 14:42:00) [35]
where (FINDATE>'26.05.2004') or (NUMBER is null)
Draught (2004-05-26 14:42:00) [36]2Nikolay M.
так то же самое в результате получается...
запрос такой:
select HOTEL, count(NUMBER) from number
where FINDATE>'26.05.2004'
GROUP BY HOTEL
HAVING count(NUMBER) > 0
результат тот же, что и без этой строки
Sandman25+1 (2004-05-26 14:41:00) [37]А откуда берется 5? Из другой таблицы?
Тогда надо
select another.HOTEL, count(*)
from another left join number on another.hotel=number.hotel
where FINDATE>'26.05.2004'
GROUP BY 1
Nikolay M. (2004-05-26 14:39:00) [38]...HAVING count(NUMBER) > 0