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

Тема в разделе "SQL", создана пользователем mrtg, 18 окт 2016.

  1. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    Здравствуйте уважаемые Знатоки.
    Помогите плс составить 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
    За ранее СПС за ответы
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

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

    http://sqlfiddle.com/ в помощь.
     
  3. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    а лефт джоин тут зачем?
     
  4. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    а хз на самом деле, групп бай и ордер бай должно п хватить.
    Просто показалось, что подзапросом оно очевидней, и написал (пчоему-то) про джоин :)
    Один фиг, топик стартер не будет читать :)
     
  5. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    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 ;

    Но это не выдает что хочу :(
     
  6. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    Так вы сами подумайте .. что такое групировка.. если группировать по времени то все времена будут в разных группах, естественно это будет не то что надо. Все что указывается в GROUP BY будет уникальным ключом в результирующем наборе записей!
    Убрать как минимум pf.PTime из GROUP BY.
    Тоже самое с PKachestvo, у вас в результате выбирается только одно а вы его в группировку опять.
    ну и т.д.
    Если вам важно только название а остальное нет то и надо по нему группировать, остальное мин() или что там лучше по условию, а если не важно какое но важно чтобы из одной записи, то скорее всего придеться делать вложенный селект.
    пробуйте..
     
    #6 -master-, 19 окт 2016
    Последнее редактирование: 19 окт 2016
  7. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    master- спс за советы.
     
  8. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    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 берёт первую встречанную из таблицы...
    не подскажете где что можно добавить, подправить.
     
  9. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    чтобы что то подсказать надо понимать чего надо
     
  10. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    Вы правы. Лудше один раз увидеть чем 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);
     
  11. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    ну то что скипты положили это хорошо, но пока не понятно что надо в итоге получить
    что должно быть в результирующем наборе? по какому критерию должны данные выводиться для этих полей?
     
  12. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    мне нужно: Сделать выборку по товарам с учетом времени первого поступления на дату 16/10/2016
    (если я правельно перевёл на русский, у меня родной язык не руский)
    :)
     
    #12 mrtg, 20 окт 2016
    Последнее редактирование: 20 окт 2016
  13. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
  14. Vladal

    Vladal Active Member

    Регистрация:
    26 май 2012
    Сообщения:
    25
    Симпатии:
    0
    Значит надо получить первую дату/время прихода на указанную дату. (хотя... всегда будет только первая дата прихода при таком подходе, надо бы наверно получить дату/время (и цену) последнего прихода ранее указанной датой.

    Тогда примерно такой подход, который я использую в 1С:
    Код (Text):
    выбрать * поместить втФрукты из Фрукты;
    выбрать * из втФрукты
    где втФрукты.ДатаПрихода в
        (выбрать первые 1
        втФрукты.ДатаПрихода
        из втФрукты
        где втФрукты.ДатаПрихода <= &ДатаОтчета
        упорядочить по втФрукты.ДатаПрихода убыв)
     
    Мой перевод на SQL по памяти, поправьте, если что с синтаксисом.
    Код (Text):
    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, да и не опускайте его, например:
    Код (Text):
    FROM post_frukt pf
    более понятно и красивей выглядит в таком виде:
    Код (Text):
    FROM post_frukt as pf
    То же и с полями упорядочивания: ORDERR BY 4 сойдет, как черновик, но можно попасть в ситуацию, когда 4-е поле будет другим, а ORDER BY 4 отсортирует по новому 4-му полю, а не тому, для которого изначально предназначалась сортировка.

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

    Ну да... будет неплохо привести 2 таблицы: исходную и ту, которую надо получить.
    С подробным описанием действий, что надо оставить, а что надо убрать.
     
    #14 Vladal, 1 ноя 2016
    Последнее редактирование: 1 ноя 2016
  15. mrtg

    mrtg Member

    Регистрация:
    18 фев 2014
    Сообщения:
    15
    Симпатии:
    0
    Vladal спс. помогли!
    спс Всем за внимание!
     
Загрузка...

Поделиться этой страницей