Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как изменить SQL запрос, что бы и пустые записи тоже были? [D7, MSSQL]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо