Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sql запрос к базе access, запрос на выборку записей с условием 
V
    Опции темы
jon007
Дата 6.4.2016, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Здравствуйте. Есть таблица в access с полями data, time, tovar, kolvo, в ней значение в поле tovar могут повторятся. Не получается сделать запрос так чтобы было выбраны все записи таблицы, исключая одинаковые значения в поле товар, но при этом была возможность выбора даты и времени в запросе и максимальное значение поля kolvo. Спасибо.
Типа записи таблицы:
data                    time            tovar            kolvo
04.04.2016    23:08:49    пластырь    12
05.04.2016    23:10:15    пластырь    13
06.04.2016    22:10:16    спички    1
06.04.2016    23:10:17    пластырь    14
06.04.2016    22:40:11    спички    2
06.04.2016    23:40:12    пластырь    15
06.04.2016    22:40:13    спички    3
06.04.2016    22:40:14    спички    4
 А на выходе получить только:
06.04.2016    23:10:18    пластырь    15
06.04.2016    22:40:14    спички    4 

Это сообщение отредактировал(а) jon007 - 7.4.2016, 13:28
PM MAIL   Вверх
homef1re
Дата 6.4.2016, 23:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











http://www.tbania.ru/
лучшие банные процедуры со всего мира,Дубовая фитобочка,
Японская баня офуро,Турецкая баня хамам,Русская баня в комплексе «Таёжные бани»
Московские бани – всегда легкий пар!Элитный комплекс отдыха
«ТАЁЖНЫЕ БАНИ» баня на дровах с печкой на березовых поленьях.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
DizzyCrazy
Дата 7.4.2016, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.11.2012

Репутация: нет
Всего: нет



select table1.data,table1.time,t.tovar,maxkolvo as kolvo from
(
--Отобрали max значения для названий во временную t
select tovar,max(kolvo) as maxkolvo from Table1 group by tovar
) t
--связали t с Table1 по названию и max количеству
inner join Table1 on
t.tovar = table1.tovar and maxkolvo = kolvo

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jon007
Дата 7.4.2016, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



DizzyCrazy, делфи ругается при запуске запроса, пишет "ошибка синтаксиса в операции JOIN". 
Не пойму почему не работает такой запрос:
Код

dm.ADOQuery1.SQL.Add('select max(kolvo) from prodazha');
 результат ноль
PM MAIL   Вверх
salik
Дата 7.4.2016, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 28.1.2011

Репутация: нет
Всего: 1



Цитата(jon007 @ 6.4.2016,  22:30)
Здравствуйте. Есть таблица в access с полями data, time, tovar, kolvo, в ней значение в поле tovar могут повторятся. Не получается сделать запрос так чтобы было выбраны все записи таблицы, исключая одинаковые значения в поле товар, но при этом была возможность выбора даты и времени в запросе и максимальное значение поля kolvo. Спасибо.
Типа записи таблицы:
data                    time            tovar            kolvo
04.04.2016    23:08:49    пластырь    12
05.04.2016    23:10:15    пластырь    13
06.04.2016    22:10:16    спички    1
06.04.2016    23:10:17    пластырь    14
06.04.2016    22:40:11    спички    2
06.04.2016    23:40:12    пластырь    15
06.04.2016    22:40:13    спички    3
06.04.2016    22:40:14    спички    4
 А на выходе получить только:
06.04.2016    23:10:18    пластырь    15
06.04.2016    22:40:14    спички    4


Код

select date, time, tovar, kolvo from prodaja
group by tovar
having
date = 'blablabla'
and time = 'blablabla'
and kolvo = max(kolvo)

PM MAIL   Вверх
jon007
Дата 8.4.2016, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Опять ругается "Попытка выполнить запрос, который не включает указанное выражение 'time' как часть статистической функции или группы". На компе стоит делфи 7 и access 2002.

Это сообщение отредактировал(а) jon007 - 8.4.2016, 11:32
PM MAIL   Вверх
superVad
Дата 8.4.2016, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Может проблема в названиях полей таблицы?
date, time скорее всего функции такие есть
PM MAIL   Вверх
Vas
Дата 8.4.2016, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 828
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Код

select  tovar, max(kolvo) from prodaja
where date=:my_date and time=:my_time
group by tovar



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
jon007
Дата 9.4.2016, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Цитата(Vas @ 8.4.2016,  21:58)
Код

select  tovar, max(kolvo) from prodaja
where date=:my_date and time=:my_time
group by tovar

Такой запрос работает на половину, выводит поле tovar и не выводит поле kolvo. Похожие запросы я уже все перепробовал.

Добавлено через 2 минуты и 42 секунды
Цитата(superVad @ 8.4.2016,  18:55)
Может проблема в названиях полей таблицы?
date, time скорее всего функции такие есть

Изначально в базе поле data, а не date, как пишут в запросах, даже исключая поле time запросы не хотят правильно работать.
PM MAIL   Вверх
Vas
Дата 9.4.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 828
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(jon007 @  6.4.2016,  21:30 Найти цитируемый пост)
исключая одинаковые значения в поле товар, но при этом была возможность выбора даты и времени в запросе и максимальное значение поля kolvo

Значит я в поставленной задаче что-то не понимаю. Если в моем запросе выкинуть условия, то выведутся все товары с максимальным количеством, а потом уже условиями выбираем по дате и времени. Группировка как раз исключит одинаковые товары.

Добавлено @ 10:59
Если еще ограничить макисмум каким-то числом, то добавьте в WHERE kolvo<:my_kolvo

Это сообщение отредактировал(а) Vas - 9.4.2016, 11:24

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  data.jpg 105,56 Kb


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
jon007
Дата 9.4.2016, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Вот выполнение Вашего запроса с выборкой по дате, выборку по времени убираем пока:
user posted image Вот запрос без даты: user posted image 
А вот запрос без группировки. 
Код

dm.ADOQuery1.SQL.Add('select tovar, kolvo from prodazha');
 
user posted image
А как сделать что бы такой запрос с группировкой выдавал не только поле товар, но и максимальное число поля количество? Я уже склоняюсь к мысли что бы вернуть программу к начальному шагу, где была таблица, в которую записыватся название товара и его количество в момент скана. В таком случаи такого запроса вполне хватает.
Код

      if dm.ADOTable1.Locate('scan', skanshtrih.text, []) then
        begin
          dm.ADOQuery1.SQL.Clear;
          dm.ADOQuery1.SQL.Add('select * from prodazha where data = date and tovar = tov');
          dm.ADOQuery1.Parameters.paramByName('date').Value:= date;
          dm.ADOQuery1.Parameters.paramByName('tov').Value:= dm.ADOTable1tovar.Value;
          dm.ADOQuery1.Open;
          if dm.ADOQuery1.RecordCount > 0 then
            begin
              dm.ADOQuery1.Last;
              col:= dm.ADOQuery1.Fields[2].Value;
              dm.ADOQuery1.Edit;
              inc(col);
              dm.ADOQuery1.Fields[0].Value:= date;
              dm.ADOQuery1.Fields[1].Value:= dm.ADOTable1tovar.Value;
              dm.ADOQuery1.Fields[2].Value:= col;
            end
          else
            begin
              dm.ADOQuery1.Insert;
              dm.ADOQuery1.Edit;
              dm.ADOQuery1.Fields[0].Value:= date;
              dm.ADOQuery1.Fields[1].Value:= dm.ADOTable1tovar.Value;
              dm.ADOQuery1.Fields[2].Value:= 1;
            end;
          dm.ADOQuery1.Post;
          dm.ADOQuery1.Close;
        end;
 Тут ADOTable1 привязан к таблице с базой товара и штирхкода к нему.
user posted image
И сделать ещё одну таблицу где будет фиксироваться время и дата скана штрихкода, ну и уже по ней делать нужные выборки по датам и времени. 

Это сообщение отредактировал(а) jon007 - 9.4.2016, 13:19
PM MAIL   Вверх
Vas
Дата 9.4.2016, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 828
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(jon007 @  9.4.2016,  11:47 Найти цитируемый пост)
А вот запрос без группировки. 
Выделить всёкод Pascal/Delphi
1:
    
dm.ADOQuery1.SQL.Add('select tovar, kolvo from prodazha');

Этот запрос пишите вы у себя в программе.

А вот такой пишу я в сообщении

Цитата(Vas @  8.4.2016,  21:58 Найти цитируемый пост)
    
select  tovar, max(kolvo) from prodaja
where date=:my_date and time=:my_time
group by tovar

Я думаю разницу вы видите. И в сообщении моем выше приложен файл с результатами на моей машине
Приложу еще раз

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  data.jpg 105,56 Kb


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Vas
Дата 9.4.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 828
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



max(kolvo) в запросе не забывайте писать, не в условии, а в результате. А если на дату у вас нет товара, то он показываться и не должен, не вижу проблем. Если на раньшую дату надо выбрать, пишите data <: my_data

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  data.jpg 105,56 Kb


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
jon007
Дата 9.4.2016, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Вот запрос:
Код

  dm.ADOQuery1.SQL.Clear;
  dm.ADOQuery1.SQL.Add('select  tovar, max(kolvo) from prodaja where date=:my_date and time=:my_time group by tovar');
  dm.ADOQuery1.Parameters.paramByName('my_date').Value:= strtodate('06.04.2016');
  dm.ADOQuery1.Parameters.paramByName('my_time').Value:= strtotime('23:10:18');
  dm.ADOQuery1.Open;
end;
 Вот ошибка:
user posted image
Исправляем название таблицы:
Код

  dm.ADOQuery1.SQL.Clear;
  dm.ADOQuery1.SQL.Add('select  tovar, max(kolvo) from prodazha where date=:my_date and time=:my_time group by tovar');
  dm.ADOQuery1.Parameters.paramByName('my_date').Value:= strtodate('06.04.2016');
  dm.ADOQuery1.Parameters.paramByName('my_time').Value:= strtotime('23:10:18');
  dm.ADOQuery1.Open;
end;
 Получаем:
user posted image
Исправляем поле date на data так как она в таблице стоит и получаем пустой ответ на запрос, хотя данные на этот день и число в таблице есть, скрины запросов на эту же дату в предыдущем посте:
Код

dm.ADOQuery1.SQL.Add('select tovar, kolvo from prodazha');

Попытка выполнить такой запрос:
Код

dm.ADOQuery1.SQL.Add('select tovar, max(kolvo) from prodazha');
 выпадает в такую ошибку:
user posted image
Я не пойму почему так происходит.
Содержимое таблицы prodazha:
data              time           tovar           kolvo
06.04.2016    22:59:41    пластырь    1
06.04.2016    22:59:43    пластырь    2
06.04.2016    23:00:16    пластырь    3
06.04.2016    23:00:53    пластырь    4
06.04.2016    23:01:08    пластырь    5
06.04.2016    23:08:24    пластырь    6
06.04.2016    23:08:27    пластырь    7
06.04.2016    23:08:28    пластырь    8
06.04.2016    23:08:30    пластырь    9
06.04.2016    23:08:44    пластырь    10
06.04.2016    23:08:46    пластырь    11
06.04.2016    23:08:49    пластырь    12
06.04.2016    23:10:15    пластырь    13
06.04.2016    23:10:17    пластырь    14
06.04.2016    23:10:18    пластырь    15
06.04.2016    22:35:06    спички    1
06.04.2016    22:40:11    спички    2
06.04.2016    22:40:13    спички    3
06.04.2016    22:40:14    спички    4
06.04.2016    22:40:15    спички    5
06.04.2016    22:40:16    спички    6
06.04.2016    22:40:17    спички    7
06.04.2016    22:40:18    спички    8
06.04.2016    22:40:19    спички    9
06.04.2016    22:42:39    спички    10
09.04.2016    14:32:07    спички    1
09.04.2016    14:34:08    спички    2
09.04.2016    14:34:11    спички    3
09.04.2016    14:34:12    спички    4
09.04.2016    14:34:13    спички    5

Это сообщение отредактировал(а) jon007 - 9.4.2016, 14:55
PM MAIL   Вверх
Vas
Дата 9.4.2016, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 828
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Нельзя использовать агрегатные функции без группировки с другими полями 

Цитата(jon007 @  9.4.2016,  14:19 Найти цитируемый пост)
Попытка выполнить такой запрос:
Выделить всёБез подсветки
1:
    
dm.ADOQuery1.SQL.Add('select tovar, max(kolvo) from prodazha');

Перепиши вот так
Код

dm.ADOQuery1.SQL.Add('select tovar, max(kolvo) from prodazha group by tovar');





Цитата(jon007 @  9.4.2016,  14:19 Найти цитируемый пост)
Исправляем название таблицы:
  dm.ADOQuery1.SQL.Clear;
  dm.ADOQuery1.SQL.Add('select  tovar, max(kolvo) from prodazha where date=:my_date and time=:my_time group by tovar');
  dm.ADOQuery1.Parameters.paramByName('my_date').Value:= strtodate('06.04.2016');
  dm.ADOQuery1.Parameters.paramByName('my_time').Value:= strtotime('23:10:18');
  dm.ADOQuery1.Open;

Дык для ADO сначала распарсить параметры в запросе надо, что-то из разряда ADOQuery.ParseParam (проверять по справке надо), а потом передавать им параметры, или на крайняк создавать самому их и тип их.

Ну и собсно читать Использование агрегатных функций в SQL обязательно.

Добавлено через 7 минут и 50 секунд
P.S. Я три раза скрин свой прикрепил, там же явно видно запрос без параметров и с group by почему нельзя для начала тупо переписать запрос и выполнить? Как же раньше учились по книжкам программировать без интернета, вот время было, одна книга + справка и все, а деваться то некуда.

Дж. Грофф, П. Вайнберг Энциклопедия SQL 3-е издание, может быть уже есть 4-е не знаю. Но почитать не помешало бы, там даже раздел есть запросы с группировкой smile


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.