Khabibb Mubarakk Ответов: 1

Как выбрать специальные данные


сначала я, используя доступ к базе данных и OLE DB для соед.

У меня заказан столик :

+------------+--------------+
| no_booking | date_service |
+------------+--------------+
| AN02091701 | 02/09/2017 |
| AN02091702 / 02/09/2017 |
| AN02091703 / 02/09/2017 |
| AN02091703 / 02/09/2017 |
| AN03091701 | 03/09/2017 |
| AN03091702| 03/09/2017 | ---? найти AN03091702
| AN04091701 | 04/09/2017 |
| AN04091702 | 04/09/2017 |
| AN05091701 | 05/09/2017 |
| AN05091702 |05/09/2017 /
| AN05091703 |05/09/2017 /
| AN07091701 | 07/09/2017 |
+------------+--------------+

Я хочу сделать букинг-сервис ..

я использую date picker для выбора даты в качестве члена запроса (точно будет случайным образом)..

условие, которое я хочу --> В один день только есть < 4 no_booking

далее я пытаюсь найти дату, у которой есть < 4 no_booking, чтобы создать no_booking автоматически.

предположение, что мы сейчас не знаем, где дата есть < 4 no_booking ...

как найти верхнюю дату, которая содержит < 4 no_booking ( дата 03/09/2017, потому что есть 2 no_booking),

затем выберите последний индекс no_booking in 03/09/2017 ----> точно AN03091702. используя самый быстрый запрос ?

Надеюсь, я правильно объясню, но извините за мой английский ..

Спасибо....

Что я уже пробовал:

select no_booking,datebo from booking group by no_booking,datebo having count (datebo) < 3 

Richard Deeming

Репост
Вы уже опубликовали это:
https://www.codeproject.com/Questions/1203803/How-to-find-nearest-date-using-query-VB-NET[^]

1 Ответов

Рейтинг:
1

Jochen Arndt

Если вам нужно выбрать только столбцы, содержащие определенное значение, вы должны использовать WHERE пункт:

SELECT nobooking,datebo FROM booking WHERE nobooking='AN30081702' GROUP BY nobooking,datebo HAVING COUNT(datebo) < 3;

Если имя столбца содержит пробел ("No Booking" вместо "nobooking") или точку, вы должны заключить его в кавычки или квадратные скобки. Если вы хотите вернуть все столбцы из таблицы, вы также можете использовать * заполнитель:
SELECT * FROM booking WHERE [No booking]='AN30081702' GROUP BY [No booking],[datebo.] HAVING COUNT([datebo.]) < 3;

Как вы можете видеть, это плохая идея-использовать пробелы и точки в именах таблиц и столбцов базы данных. Избегайте их (и ключевых слов SQL тоже) в качестве имен, если это возможно.


Khabibb Mubarakk

предположение, что вы не знаете, как no_boking, потому что будет так много данных..
сначала выберите no booking where datebo having count < 3 :
так будет и индекс такой :
--------------
+ No_booking +
--------------
+ AN30081701 + - - - > это есть date.bo (30/80/2017) начало даты
+ AN30081702 + - - - > (30/80/2017)
+ AN01091701 +
+ AN02091701 +
--------------
затем выберите последний индекс no_booking в верхней части даты
так будет выбран: AN30081702
Надеюсь, вы поймете мое объяснение.
спасибо

Graeme_Grant

Использовать союз всех объединить результаты двух запросов: 1 без брони, один для заказов. Смотрите это решение ранее сегодня: Поиск одного значения в нескольких таблицах[^]- принцип тот же.

Khabibb Mubarakk

Хэй грант, я хочу попросить тебя .
после того как я решил его с помощью этого запроса :

"select top 1 no_booking from booking where date_service in (select top 1 date_service from booking group by date_service having count (date_service) < 4) order by no_booking desc"

- у меня новая проблема !
когда данные условия такие :
+------------+--------------+
| no_booking | date_service |
+------------+--------------+
| AN02091701 | 02/09/2017 |
| AN02091702 / 02/09/2017 |
| AN02091703 / 02/09/2017 |
| AN02091704 / 02/09/2017 |
| AN03091701 | 03/09/2017 |
| AN03091702 | 03/09/2017 |
| AN03091703 | 03/09/2017 |
| AN03091704 | 03/09/2017 / -- & gt; date_service 04/09/2017 (is не имеет no_booking)
| AN05091701 | 05/09/2017 |
| AN05091702 |05/09/2017 /
| AN05091703 |05/09/2017 /
| AN07091701 | 07/09/2017 |
+------------+--------------+
я знаю, что мой запрос просто выбирает AN05091703 на дату 05/09/2017, и следующую команду я делаю next no_booking AN05091704 .
но я тоже хочу выбрать или найти дату 04/09/2017, а затем сделать новый no_booking AN04091701 .
как сделать правильный запрос ?

Graeme_Grant

Использовать оператор case[^] для пользовательского поля, чтобы определить, есть ли у него бронирование или нет.

Khabibb Mubarakk

но сначала я должен найти дату 04/09/2017 ???

Graeme_Grant

Определите его в выделенной части SQL-запроса.. все объяснено в приведенной ссылке.

Khabibb Mubarakk

определить ? это означает, что мы знаем дату, которая не имеет no_booking.
предположение, что мы этого не знаем

Graeme_Grant

Нет, если вычисляемое поле case помечено как HasBooking (bool)... Опять же, все ответили по предоставленной ссылке. Вы просто должны прочитать и сделать работу.

Это новый вопрос, поэтому я остановлюсь здесь. Считайте, что она закрыта. Любая дополнительная информация или вопрос требуют начала нового.

Khabibb Mubarakk

Оке Грант ... спасибо

Jochen Arndt

Я только что ответил на первоначальный вопрос, основываясь на имеющейся информации.
В то время показывались названия столбцов, где "databo." и "no booking", и не было ясно, что ANS должен быть последним с самой ранней даты, когда менее 3 бронирований в этот день (надеюсь, это то, что вы хотите).

Таким образом, вы можете использовать объединение, предложенное Graeme_Grant. Также можно получить требуемый результат, отсортировав сначала по дате (самая ранняя сверху), а затем по no_booking (последняя сверху).