Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.023 c
3-1085494091
Tom
2004-05-25 18:08
2004.06.20
TADOQuery.LoadFromFile


1-1085950933
NeVIP.
2004-05-31 01:02
2004.06.20
ExcelApplication


3-1085299343
korvin
2004-05-23 12:02
2004.06.20
Помогите с гридом.


1-1085933661
tamroF
2004-05-30 20:14
2004.06.20
Помажите: random в DLL


3-1085722787
maximus_
2004-05-28 09:39
2004.06.20
InterBase 6.5