Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отбор данных...

3.1K
04 февраля 2004 года
x_Coder
22 / / 26.01.2004
Я пишу программу на VisualBasic 6.
Использую бузу Access (.mdb).

Так вот в чем, собственно, вся загвоздка.

У меня есть таблица Clients. В ней содержится информация про посетителей гостиницы.
Структура таблицы следующая:
_________________________________________
Id - int PRIMARY KEY - (номер)
Name - Text - (имя)
Surname - Text - (фамилия)
Second_name - Text - (отчество)
Country - Text - (страна)
City - Text - (город)
Passport_number - Text - (номер паспорта)
Date - Date/Time - (дата поселения)
________________________________________

Теперь предположим мне нужно создать отчет за месяц.
В отчет должна помещаться информация про 10 самых частых посетителей.
Каким образом можно найти среди всех только десять ? Какой запрос нужно для этого сформировать?

И второе. Допустим мне нужно создать отчет в котором будет выведена информация про количество людей из каждой
страны и города. Примерно так:

Россия - Москва - 100 человек
Киев - Украина - 253 человека
...................................................
Всего 353 человека

Какой запрос нужно для этого сформировать?
Ясно, что здесь нужно будет использовать что-то вроде следующего WHERE City = 'Город' AND Country = 'Страна'

Заранее благодарен, x_Coder!
319
04 февраля 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by x_Coder
Я пишу программу на VisualBasic 6.
Использую бузу Access (.mdb).

Так вот в чем, собственно, вся загвоздка.

У меня есть таблица Clients. В ней содержится информация про посетителей гостиницы.
Структура таблицы следующая:
_________________________________________
Id - int PRIMARY KEY - (номер)
Name - Text - (имя)
Surname - Text - (фамилия)
Second_name - Text - (отчество)
Country - Text - (страна)
City - Text - (город)
Passport_number - Text - (номер паспорта)
Date - Date/Time - (дата поселения)
________________________________________

Теперь предположим мне нужно создать отчет за месяц.
В отчет должна помещаться информация про 10 самых частых посетителей.
Каким образом можно найти среди всех только десять ? Какой запрос нужно для этого сформировать?

И второе. Допустим мне нужно создать отчет в котором будет выведена информация про количество людей из каждой
страны и города. Примерно так:

Россия - Москва - 100 человек
Киев - Украина - 253 человека
...................................................
Всего 353 человека

Какой запрос нужно для этого сформировать?
Ясно, что здесь нужно будет использовать что-то вроде следующего WHERE City = 'Город' AND Country = 'Страна'

Заранее благодарен, x_Coder!


какую модель для доступа к данным используешь???

первый вопрос:
фильтруешь все данные по дате, потом полученные данные сохраняешь в отдельном датасете и поочередно накладываешь фильтр на ID пользователя и подсчитываешь число записей.

второй вопрос:
делай отдельную таблицу для каждой страны и для каждого города с индексом страны - если посетитель в первый раз откуда-то, то добавляй новую запись.
потом в цикле для всех городов делаешь запрос с WHERE City=город.название and Country=город.страна
и подсчитываешь число записей (возможно надо будет сделать промежуточный запрос чтобы получить название сраны).

258
05 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by x_Coder
Я пишу программу на VisualBasic 6.
Использую бузу Access (.mdb).

Так вот в чем, собственно, вся загвоздка.

У меня есть таблица Clients. В ней содержится информация про посетителей гостиницы.
Структура таблицы следующая:
_________________________________________
Id - int PRIMARY KEY - (номер)
Name - Text - (имя)
Surname - Text - (фамилия)
Second_name - Text - (отчество)
Country - Text - (страна)
City - Text - (город)
Passport_number - Text - (номер паспорта)
Date - Date/Time - (дата поселения)
________________________________________

Теперь предположим мне нужно создать отчет за месяц.
В отчет должна помещаться информация про 10 самых частых посетителей.
Каким образом можно найти среди всех только десять ? Какой запрос нужно для этого сформировать?



Текстовая строка запроса будет такая:

 
Код:
strSQL = "SELECT TOP 10 Clients.Passport_number, " _
  & "DFirst('Name', 'Clients', '[Passport_number]='' & [Passport_number] & ''') As Name " _
  & "DFirst('Surname', 'Clients', '[Passport_number]='' & [Passport_number] & ''') As Name " _
.....
  & "FROM Clients " _
  & "WHERE (((Month([Date])) = & iMonth &)) " _
  & "GROUP BY Clients.Passport_number " _
  & "ORDER BY Count(Clients.Passport_number) DESC"


Уникальным полем для посетителя я выбрал паспортные данные. Именно по этому полю происходит группировка и отбор лучших десьти.
Нюанс: у нас есть например 15 записей на одного человека, сгрупировав таблицу по полю Passport_number мы получаем таблицу с уникальными (неповторяющимися) номерами паспортов. Если мы хотим кроме того показать еще его Имя, Фамилию и т.д., то тут у нас два варианта.
Если мы уверены что во всех десьти записях на одного и того же человека будут указаны абсолютно одинаковые данные, то можно группировать сразу Passport_number, Name, Surname и т.д., но естественно если не дай бог, в одной записи посетителя назовут не Смит, а Смитт (а все остальные данные будут одинаковые), то мы полцчим в итоге в запросе двух разных посетителей каждого со своим кол-вом посещений.
Поэтому я предложил (и тем более что я не знал ваших условий формирований таблицы) более универсальный способ извлечения имен и т.д.Делоется так - по известному номеру паспорта мы через функцию DFirst извлекаем name, surname,... из первой же найденной записи. В принципе функцию DFirst можно легко заменить подчиненным запросом с SELECT TOP 1..

Поэтому вот эти .... в середине запроса имеют ввиду, что по необходимости добалвения столбцов, надо повторить также как и с Name и Surname. Просто я не стал все столбцы расписывать, они там по аналогии.

iMonth - переменная типа Integer, номер месяца

В принципе есть смысл в базе Access сохранить такой запрос как постоянный, а месяц передавать как параметр и и VBA вызвать его уже по имении, а не формировать srtSQL каждый раз динамически.

Преймущества: сохраненный в базе запрос (и один раз уже запущенный) хранится в базе в неком откомпиллированном виде. Т.е. ядро базы уже составила оптимальный план выполнения запроса и кроме того каждый раз выполняя запрос база собирает статистические данные помогающие оптимизировать выполнение запроса. Т.о. сохраненный запрос будет работать немного быстрее, да и нагляднее - лежит себе на видном месте и его из разных мест коды VBA можно вызывать, а как поправить надо, так он один такой, правь в конструкторе не залезая в код.
258
05 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Да вот еще, более существенный момент.

Итоговую выборку лучше получать составив сложный SQL-запрос, чем открывая рекодсет и ползая по нему отбирать данные, т.к. любое ползание по рекодсету отнимает в десятки, сотни разы больше времени, чем таже выборка реализованная ядром базы на основе SQL-запроса.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог