Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Как изменить 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.036 c
6-1082964172
MDeamon
2004-04-26 11:22
2004.06.20
Снятие ститистики с Cisco


9-1076765932
Cash
2004-02-14 16:38
2004.06.20
Че такое с DelphiX


1-1086342787
Ruslan
2004-06-04 13:53
2004.06.20
Не могу очистить TreeView.


14-1086216097
hiperLogun
2004-06-03 02:41
2004.06.20
XP Menu


1-1086516253
Alexis
2004-06-06 14:04
2004.06.20
резиновый StringGrid...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский