• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

составить 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

За ранее СПС за ответы
 
V

vital

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

в помощь.
 
V

vital

а хз на самом деле, групп бай и ордер бай должно п хватить.
Просто показалось, что подзапросом оно очевидней, и написал (пчоему-то) про джоин :)
Один фиг, топик стартер не будет читать :)
 
M

mrtg

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 ;

Но это не выдает что хочу :(
 
M

-master-

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

mrtg

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 берёт первую встречанную из таблицы...
не подскажете где что можно добавить, подправить.
 
M

-master-

чтобы что то подсказать надо понимать чего надо
 
M

mrtg

Вы правы. Лудше один раз увидеть чем 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);
 
M

-master-

ну то что скипты положили это хорошо, но пока не понятно что надо в итоге получить
что должно быть в результирующем наборе? по какому критерию должны данные выводиться для этих полей?
 
M

mrtg

мне нужно: Сделать выборку по товарам с учетом времени первого поступления на дату 16/10/2016
(если я правельно перевёл на русский, у меня родной язык не руский)
:)
 
Последнее редактирование модератором:
V

vital

, ну пожалуйста..
 
V

Vladal

Выбери мне все фрукты (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 таблицы: исходную и ту, которую надо получить.
С подробным описанием действий, что надо оставить, а что надо убрать.
 
Последнее редактирование модератором:
Мы в соцсетях:

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