Текущий архив: 2004.06.20;
Скачать: CL | DM;
Вниз
Как изменить SQL запрос, что бы и пустые записи тоже были? Найти похожие ветки
← →
Draught © (2004-05-26 14:36) [0]есть 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
← →
Nikolay M. © (2004-05-26 14:39) [1]...HAVING count(NUMBER) > 0
← →
Sandman25+1 (2004-05-26 14:41) [2]А откуда берется 5? Из другой таблицы?
Тогда надо
select another.HOTEL, count(*)
from another left join number on another.hotel=number.hotel
where FINDATE>"26.05.2004"
GROUP BY 1
← →
Draught © (2004-05-26 14:42) [3]2Nikolay M.
так то же самое в результате получается...
запрос такой:
select HOTEL, count(NUMBER) from number
where FINDATE>"26.05.2004"
GROUP BY HOTEL
HAVING count(NUMBER) > 0
результат тот же, что и без этой строки
← →
Johnmen © (2004-05-26 14:42) [4]
where (FINDATE>"26.05.2004") or (NUMBER is null)
← →
Draught © (2004-05-26 14:59) [5]Так похоже немного непонятно задал вопрос:
Есть 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
← →
Соловьев © (2004-05-26 14:59) [6]а почему не
HAVING count(NUMBER) >= 0
← →
Draught © (2004-05-26 15:03) [7]2Sandman25+1, да-да, похоже что надо HOTEL брать из другой таблицы...
← →
Соловьев © (2004-05-26 15:12) [8]
> [5] Draught © (26.05.04 14:59)
select hotel, (select count(number) from number where number.hotel=h.hotel)
from hotel h
← →
Johnmen © (2004-05-26 15:21) [9]
select HOTEL.hotel, count(*)
from HOTEL
left join NUMBER on HOTEL.hotel=NUMBER.hotel
where FINDATE>"26.05.2004"
GROUP BY HOTEL.hotel
← →
Draught © (2004-05-26 15:53) [10]2Johnmen
а расписать немного поподробнее можно??? т.е. где что означает
особенно меня интересует
left join NUMBER on HOTEL.hotel=NUMBER.hotel
это мне немного непонятно
и
select HOTEL.hotel, count(*)
from hotel
последнее я так понимаю выборка всех записей HOTEL из таблицы HOTEL, но зачем там count(*)?
← →
Соловьев © (2004-05-26 16:16) [11]
> [10] Draught © (26.05.04 15:53)
[8] - не работает?
← →
Draught © (2004-05-26 16:22) [12]так, немного поменят в табличке 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" то показывает все записи... но условие при этом не обрабатывается
← →
Draught © (2004-05-26 16:26) [13]млин, уже запарился...
счас простой GRID добавлю, в котором будут все записи из таблицы HOTEL и заполню его данными из запроса, т.е. соответствующему HOTEL сопоставлю количество NUMBER... а все, что в запросе будет отсутствовать будет нулевым... :-D
← →
Sandman25+1 (2004-05-26 16:26) [14][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
← →
Johnmen © (2004-05-26 16:27) [15]+ см. [4]
← →
Draught © (2004-05-26 16:41) [16]вообщем не работет все-равно
вариант остается с обычным GRID"ом
← →
Соловьев © (2004-05-26 16:48) [17]select hotel, (select count(number) from number where number.hotel=h.hotel)
from hotel h
where FINDATE>"26.05.2004"
работает???
← →
Sandman25+1 (2004-05-26 16:50) [18]Точнее, вот так:
select hotel, (select count(number) from number where number.hotel=h.hotel
and FINDATE>"26.05.2004")
from hotel h
И не надо так нервничать. Если автор хочет мучиться, никто ему этого не запретит.
← →
Соловьев © (2004-05-26 16:53) [19]
> И не надо так нервничать.
та я спокоен :)
пусть мучается...
← →
Draught © (2004-05-26 16:55) [20]2Соловьев
если можно, то немного расписать, немного непонятно что такое h
да и к тому же в таком варианте поле FINDATE будет неизвестным
← →
Соловьев © (2004-05-26 16:57) [21]
> [20] Draught © (26.05.04 16:55)
h - псевдоним таблицы HOTEL, т.е. ссылка на нее
> да и к тому же в таком варианте поле FINDATE будет неизвестным
к какой таблице оно относится?
← →
Draught © (2004-05-26 17:00) [22]FINDATE относится к таблице NUMBER
вариант который показал Sandman25+1 вроде работает, но все результаты - 0
← →
Draught © (2004-05-26 17:01) [23]FINDATE относится к таблице NUMBER
вариант который показал Sandman25+1 вроде работает, но все результаты - 0
← →
Соловьев © (2004-05-26 17:04) [24]select h.hotel, (select count(number) from number where number.hotel=h.hotel
and number.FINDATE>"26.05.2004")
from hotel h
← →
Draught © (2004-05-26 17:06) [25]тоже самое, одни нули в результате
hotel все есть, но вот значения у них у всех 0
← →
Sandman25+1 (2004-05-26 17:07) [26]или
select h.hotel, (select count(*) from number where number.hotel=h.hotel
and number.FINDATE>"26.05.2004")
from hotel h
← →
Соловьев © (2004-05-26 17:15) [27]
> number.FINDATE>"26.05.2004"
значит проблема тут
← →
Draught © (2004-05-26 17:21) [28]Соловьев, в каком смысле проблема тут???
FINDATE - поле, дата окончания
в таблице NUMBER есть поля
HOTEL
NUMBER
FINDATE
эта таблица точно содержит заполнеными поля HOTEL и NUMBER поле HOTEL можно выбирать как из таблицы HOTEL, так и из таблицы NUMBER - значения это не имеет, SQL запрос возвращает одинаковые результаты
пример таблицы NUMBER:
HOTEL|NUMBER
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
3 66
3 67
3 68
3 69
3 70
3 71
4 1
4 2
4 3
4 4
4 5
4 6
так же есть поле FINDATE - в котором значение по умолчанию null, т.е. оно пустое, но некоторые поля содержат дату, и нужно узнать количество записей дата в которых больше заданной
← →
Sandman25+1 (2004-05-26 17:22) [29]Повторяю.
select h.hotel, (select count(*) from number where number.hotel=h.hotel
and number.FINDATE>"26.05.2004")
from hotel h
← →
Draught © (2004-05-26 17:25) [30]2Sandman25+1
результат:
hotel | f
1 0
2 0
3 0
4 0
5 0
← →
Draught © (2004-05-26 17:27) [31]Sandman25+1
для примера, первый запрос возвращал результат для тех же полей
hotel|f
1 2
5 1
← →
Draught © (2004-05-26 17:28) [32]а хотелось бы получить результат
hotel | f
1 2
2 0
3 0
4 0
5 1
сорри за флуд!!!
← →
Sandman25+1 (2004-05-26 17:30) [33][31] Draught © (26.05.04 17:27)
Это результаты для таблицы, заполненной в соответствии с [28]?
← →
Draught © (2004-05-26 17:36) [34]Sandman25+1 да, это есть результат для таблицы заполненой в соответствии с [28] только в [28] отображена не вся таблица, т.е. не все записи и не отображено поле FINDATE, о нем я уже писал, оно либо пустое, либо содержит дату.
Там для HOTEL=1 всего 2 поля FINDATE удовлетворяют условию FINDATE>"26.05.2004" для остальных вообще не удовлетворяют, и для HOTEL=5 всего 1 запись? удовлетворяющая условию FINDATE>"26.05.2004"
более конкретный пример:
HOTEL|NUMBER|FINDATE
1 1 28.05.2004
1 2 24.05.2004
1 3
1 4
1 5 29.05.2004
...
3 66
3 67
3 68
3 69 23.05.2004
3 70
3 71
4 1
4 2
...
5 1 25.06.2004
5 2
5 3
← →
Sandman25+1 (2004-05-26 17:40) [35][34] Draught © (26.05.04 17:36)
Очень странно. [29] Sandman25+1 (26.05.04 17:22) должен был работать. Я попробую сделать тестовые таблички...
← →
Draught © (2004-05-26 17:42) [36]я могу кинуть таблички если надо...
← →
Sandman25+1 (2004-05-26 17:47) [37]Ох уж этот BDE с его ограничениями...
Вот, вроде работает.
select hotel.HOTEL, count(number.number)
from hotel left join number on hotel.hotel=number.hotel
and mydate>"26.05.2004"
GROUP BY hotel.hotel
← →
Draught © (2004-05-27 08:07) [38]2Sandman25+1, спасиб огромное, этот запрос хорошо работает и возвращает все как положено... немного переделал его под свои таблички:
select hotel.id_HOTEL, count(number.number)
from hotel left join number on hotel.id_hotel=number.hotel
and number.FINDATE>"26.05.2004"
GROUP BY hotel.id_hotel
Страницы: 1 вся ветка
Текущий архив: 2004.06.20;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.027 c