составить SQL запрос

  • Автор темы Автор темы mrtg
  • Дата начала Дата начала
M

mrtg

Здравствуйте уважаемые Знатоки.
Помогите плс составить SQL запрос. (не силён SQL :) )
Программка на Delphi7 обращается на базу *.mdb. (работает нлрмально)
На базе есть таблица post_frukt. Таблица post_frukt имеет столбцы :
«PDdata, PTime,PKachestvo,PNazvaniye,PProizvodstv,PKg» поле ID нет.
Нужен SELECT:
Выбери мне все фрукты (SELECT PDdata, PTime,PKachestvo,PNazvaniye,PProizvodstv,PKg ) по одному названию, только один если повторяется и первое время(PTime) прихода, Где дата (WHERE (PDdata =#10/16/2016#) AND….) ровна 16/10/2016.
Безымянный.JPG

За ранее СПС за ответы
 
А свои попытки хде?
Стоит почитать про DISTINCT и LEFT JOIN для начала. Вряд ли вам кто-то будет просто так решать нахаляву. Или показывайте что делали и что не получилось или в раздел где за деньги решают задачи.

в помощь.
 
а хз на самом деле, групп бай и ордер бай должно п хватить.
Просто показалось, что подзапросом оно очевидней, и написал (пчоему-то) про джоин :)
Один фиг, топик стартер не будет читать :)
 
Vital и -master- спс за внимание, советы и сылку.
Я чайник в запросах. не слишком часто приходится связываться с ними. Моя ошибка не показал свой запрос сразу. А так кажется дай мне готовой запрос.

SELECT pf.PDdata, Min(pf.PTime) AS Tm, pf.PKachestvo, pf.PNazvaniye, pf.PProizvodstv, pf.PKg
FROM post_frukt pf
WHERE (pf.PDdata='2016-10-16')
GROUP BY pf.PNazvaniye, pf.PDdata, pf.PTime, pf.PKachestvo, pf.PProizvodstv, pf.PKg
ORDER BY 4 DESC ;

Но это не выдает что хочу :(
 
Так вы сами подумайте .. что такое групировка.. если группировать по времени то все времена будут в разных группах, естественно это будет не то что надо. Все что указывается в GROUP BY будет уникальным ключом в результирующем наборе записей!
Убрать как минимум pf.PTime из GROUP BY.
Тоже самое с PKachestvo, у вас в результате выбирается только одно а вы его в группировку опять.
ну и т.д.
Если вам важно только название а остальное нет то и надо по нему группировать, остальное мин() или что там лучше по условию, а если не важно какое но важно чтобы из одной записи, то скорее всего придеться делать вложенный селект.
пробуйте..
 
Последнее редактирование модератором:
master- ещё раз здравствуйте!
запрос

SELECT pf.PDdata, Min(pf.PTime) AS Tm, pf.PKachestvo, pf.PNazvaniye, pf.PProizvodstv, pf.PKg
FROM post_frukt pf
WHERE (pf.PDdata='2016-10-16')
GROUP BY pf.PNazvaniye
ORDER BY 4 ;
выдаёт почти то что я хочу, но столбцы pkachestvo и pkg берёт первую встречанную из таблицы...
не подскажете где что можно добавить, подправить.
 
чтобы что то подсказать надо понимать чего надо
 
Вы правы. Лудше один раз увидеть чем 100 раз услышать :)
если хотите вот...
CREATE TABLE `post_frukt` (
`PDdata` date NOT NULL,
`PTime` time NOT NULL,
`PKachestvo` varchar(5) NOT NULL,
`PNazvaniye` varchar(20) NOT NULL,
`PProizvodstv` varchar(10) NOT NULL,
`PKg` int(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `post_frukt` (`PDdata`, `PTime`, `PKachestvo`, `PNazvaniye`, `PProizvodstv`, `PKg`) VALUES
('2016-10-16', '10:55:00', '1', 'Яблоко', '880', 10),
('2016-10-16', '11:40:00', '2', 'Груша', '891', 100),
('2016-10-16', '12:45:00', '1', 'Яблоко', '880', 30),
('2016-10-16', '13:59:00', '3', 'Яблоко', '880', 40),
('2016-10-16', '10:10:00', '2', 'Яблоко', '880', 50),
('2016-10-16', '10:55:00', '1', 'Груша', '891', 150),
('2016-10-16', '12:55:00', '1', 'Виноград', '888', 200),
('2016-10-16', '11:40:00', '1', 'Персик', '999', 300),
('2016-10-17', '15:23:00', '2', 'Яблоко', '880', 230),
('2016-10-17', '07:23:00', '2', 'Яблоко', '880', 632);

или мне нужно что то такое, но не могу до конца грамотно составить запрос
SELECT Min(pf.PTime) AS Tm, pf.PKachestvo, pf.PKg
FROM post_frukt pf
WHERE (pf.PProizvodstv = (SELECT f.PProizvodstv, f.PDdata, f.PNazvaniye
FROM post_frukt f
WHERE (f.PDdata='2016-10-16')
GROUP BY f.PNazvaniye
ORDER BY 2);
 
ну то что скипты положили это хорошо, но пока не понятно что надо в итоге получить
что должно быть в результирующем наборе? по какому критерию должны данные выводиться для этих полей?
 
мне нужно: Сделать выборку по товарам с учетом времени первого поступления на дату 16/10/2016
(если я правельно перевёл на русский, у меня родной язык не руский)
:)
 
Последнее редактирование модератором:
, ну пожалуйста..
 
Выбери мне все фрукты (SELECT PDdata, PTime,PKachestvo,PNazvaniye,PProizvodstv,PKg ) по одному названию, только один если повторяется и первое время(PTime) прихода, Где дата (WHERE (PDdata =#10/16/2016#) AND….) ровна 16/10/2016.
Значит надо получить первую дату/время прихода на указанную дату. (хотя... всегда будет только первая дата прихода при таком подходе, надо бы наверно получить дату/время (и цену) последнего прихода ранее указанной датой.

Тогда примерно такой подход, который я использую в 1С:
Код:
выбрать * поместить втФрукты из Фрукты;
выбрать * из втФрукты
где втФрукты.ДатаПрихода в
    (выбрать первые 1
    втФрукты.ДатаПрихода
    из втФрукты
    где втФрукты.ДатаПрихода <= &ДатаОтчета
    упорядочить по втФрукты.ДатаПрихода убыв)
Мой перевод на SQL по памяти, поправьте, если что с синтаксисом.
Код:
select
    PDdata as PDdata,
    PTime as PTime,
    PKachestvo as PKachestvo,
    PNazvaniye as PNazvaniye,
    PProizvodstv as PProizvodstv,
    PKg as PKg
into temptable
;
select * from temptable as tt
where
    tt.pdata in
        (select top 1
            tt.pdata
        from
            tt
        where
            tt.pdata <= &SetDate
        order by
            tt.pdata desc)
Тут desc я выделил для того, чтобы понимать, что мы берем - первые или последние значения на указанную дату.

Ну и совет общего назначения автору - не ленитесь писать псевдонимы после ключевого слова AS, да и не опускайте его, например:
Код:
FROM post_frukt pf
более понятно и красивей выглядит в таком виде:
Код:
FROM post_frukt as pf
То же и с полями упорядочивания: ORDERR BY 4 сойдет, как черновик, но можно попасть в ситуацию, когда 4-е поле будет другим, а ORDER BY 4 отсортирует по новому 4-му полю, а не тому, для которого изначально предназначалась сортировка.

Это я так, тихо и беззлобно вредничаю.

мне нужно: Сделать выборку по товарам с учетом времени первого поступления на дату 16/10/2016
Ну да... будет неплохо привести 2 таблицы: исходную и ту, которую надо получить.
С подробным описанием действий, что надо оставить, а что надо убрать.
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!