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"
Отбор данных...
Использую бузу 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!
Цитата:
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!
Я пишу программу на 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=город.страна
и подсчитываешь число записей (возможно надо будет сделать промежуточный запрос чтобы получить название сраны).
Цитата:
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 самых частых посетителей.
Каким образом можно найти среди всех только десять ? Какой запрос нужно для этого сформировать?
Я пишу программу на 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 самых частых посетителей.
Каким образом можно найти среди всех только десять ? Какой запрос нужно для этого сформировать?
Текстовая строка запроса будет такая:
Код:
Уникальным полем для посетителя я выбрал паспортные данные. Именно по этому полю происходит группировка и отбор лучших десьти.
Нюанс: у нас есть например 15 записей на одного человека, сгрупировав таблицу по полю Passport_number мы получаем таблицу с уникальными (неповторяющимися) номерами паспортов. Если мы хотим кроме того показать еще его Имя, Фамилию и т.д., то тут у нас два варианта.
Если мы уверены что во всех десьти записях на одного и того же человека будут указаны абсолютно одинаковые данные, то можно группировать сразу Passport_number, Name, Surname и т.д., но естественно если не дай бог, в одной записи посетителя назовут не Смит, а Смитт (а все остальные данные будут одинаковые), то мы полцчим в итоге в запросе двух разных посетителей каждого со своим кол-вом посещений.
Поэтому я предложил (и тем более что я не знал ваших условий формирований таблицы) более универсальный способ извлечения имен и т.д.Делоется так - по известному номеру паспорта мы через функцию DFirst извлекаем name, surname,... из первой же найденной записи. В принципе функцию DFirst можно легко заменить подчиненным запросом с SELECT TOP 1..
Поэтому вот эти .... в середине запроса имеют ввиду, что по необходимости добалвения столбцов, надо повторить также как и с Name и Surname. Просто я не стал все столбцы расписывать, они там по аналогии.
iMonth - переменная типа Integer, номер месяца
В принципе есть смысл в базе Access сохранить такой запрос как постоянный, а месяц передавать как параметр и и VBA вызвать его уже по имении, а не формировать srtSQL каждый раз динамически.
Преймущества: сохраненный в базе запрос (и один раз уже запущенный) хранится в базе в неком откомпиллированном виде. Т.е. ядро базы уже составила оптимальный план выполнения запроса и кроме того каждый раз выполняя запрос база собирает статистические данные помогающие оптимизировать выполнение запроса. Т.о. сохраненный запрос будет работать немного быстрее, да и нагляднее - лежит себе на видном месте и его из разных мест коды VBA можно вызывать, а как поправить надо, так он один такой, правь в конструкторе не залезая в код.
Итоговую выборку лучше получать составив сложный SQL-запрос, чем открывая рекодсет и ползая по нему отбирать данные, т.к. любое ползание по рекодсету отнимает в десятки, сотни разы больше времени, чем таже выборка реализованная ядром базы на основе SQL-запроса.