powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Помогите составить запрос.
34 сообщений из 34, показаны все 2 страниц
Помогите составить запрос.
    #35639435
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Есть запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT
    r_kod,
    in_date,
    in_pkod
FROM
    invoice,
    goods_r
WHERE
    in_ttype= 1 
AND
    in_key=r_key
AND
    r_kod
IN (
    SELECT
        r_kod
    FROM
        invoice,
        goods_r
    WHERE
        in_pkod='А01'
    AND
        in_ttype= 1 
    AND
        in_key=r_key
    )
    ORDER BY
        r_kod

На выходе получаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 100561 	 2006 - 07 - 26 		А01
 100561 	 2007 - 03 - 28 		А01
 100561 	 2006 - 04 - 19 		А01
 100561 	 2006 - 04 - 11 		А01
 100561 	 2006 - 08 - 15 		А01
 100561 	 2008 - 04 - 07 		ююt
 100561 	 2006 - 02 - 21 		А01
 100563 	 2007 - 06 - 20 		А01
 100563 	 2007 - 05 - 30 		А01
 100563 	 2006 - 06 - 21 		А01
 100563 	 2006 - 02 - 21 		А01
 100564 	 2008 - 08 - 21 		ююt
 100564 	 2008 - 06 - 20 		ююt
 100564 	 2006 - 04 - 11 		А01
 100564 	 2006 - 02 - 21 		А01
 100564 	 2008 - 04 - 07 		ююt
...

хочется получить эти же поля, но дергать максимальную дату на каждое поле r_kod и делать проверку на соответствие in_pkod='А01'. (!)Временную таблицу не создать.
Голову сломал!
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35639980
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно понять, что должен делать нужный тебе запрос по приведённому запросу, который делает не то что нужно :) :(
Лучше приводить структуру таблиц и "словами сформулированный" запрос...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640111
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. попробую так)
Есть две таблицы.
invoice - шапки накладных
goods_r - тело накладных
связаны по in_key и r_key соответственно.
in_ttype - тип накладной. "1" символизирует приход.
in_pkod - код поставщика.
r_kod - товар.

(!)Один и тот же товар могут поставлять разные поставщики.

Задача:
Выбрать весь товар, последним поставщиком которого является поставщик с кодом "А01"
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640366
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия IDS, чтоб мы знали возможности вашего SQL :)
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640492
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
серверов очень много и разные версии.
низшая - 7.30.UC10
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640590
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то этакое можно попробывать использовать
Код: plaintext
1.
...   and  in_date =(select max(in_date ) from ...) ...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640693
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ollegЧто-то этакое можно попробывать использовать
Код: plaintext
1.
...   and  in_date =(select max(in_date ) from ...) ...

Да не) Я чего только не перепробывал.
в этом случае вернется одна дата - максимальная. А мне то нужно для каждого товара.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640736
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для 7.3 думаю без временных таблиц лучше не пытаться, там извратов с set-ом нет.
Вообще, запрос реален, но сугубо в академических целях. Если данных маломальски много, я бы даже не пытался.

Для упрощения, подготовьте sql создающий таблички, тестовые данные и результат, которые хочется получить.

Если вы датите честное слово, что потом все таки переделаете на временную таблицу, я вам сделаю изврат.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640748
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT
r_kod,
max(in_date)
FROM
invoice,
goods_r
WHERE
in_ttype=1
AND
in_key=r_key
AND
in_pkod = 'A01'
GROUP BY r_kod
ORDER BY r_kod
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640772
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Daugava , спасибо за ответ!
Тоже думал что нереализуемо, но надежда умирает последней)
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640779
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Daugava , на временную переделать не получится 100 процентно)
User БД дан с жесткими ограничениями расширить которые не представляется возможным.
авторДля упрощения, подготовьте sql создающий таблички, тестовые данные и результат, которые хочется получить.
т.е. все же можно в один запрос нужные мне данные?
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640856
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А написать свою процедуру нельзя?
Еще одно, у товаров и накладных id надеюсь есть? Или в течение дня один товар может быть поставлен только одним поставщиком и только один раз?
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35640896
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezОк. попробую так)
Есть две таблицы.
invoice - шапки накладных
goods_r - тело накладных
связаны по in_key и r_key соответственно.
in_ttype - тип накладной. "1" символизирует приход.
in_pkod - код поставщика.
r_kod - товар.

(!)Один и тот же товар могут поставлять разные поставщики.

Задача:
Выбрать весь товар, последним поставщиком которого является поставщик с кодом "А01"

Приблизительно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select r_kod, in_date, in_pkod
from goods_r r1, invoice i1
where i.in_key=r.r_key
and  i1.in_pkod= "А01"
and in_date =  (
select max(in_date) 
from  goods_r r1, invoice i2
where  i2.in_key=r2.r_key and i1.in_pkod=i2.inp_kod  and r1.r_kod=r2.k_kod
)

но работать может долго .
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35641078
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-но работать может долго .
помогло?
если нет - то вопрос "r_key - это точно поле внешнего ключа в таблице goods_r на таблицу invoice?"

если помогло но ОЧЕНЬ медленно - возможно нет "правильных" индексов...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643396
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь!
У Вас запрос был написан с небольшими помарками. Я исправил
авторselect r_kod, in_date, in_pkod
from goods_r r1, invoice i1
where i1.in_key=r1.r_key
and i1.in_pkod= 'А01'
and in_date = (
select max(in_date)
from goods_r r2, invoice i2
where i2.in_key=r2.r_key and i1.in_pkod=i2.in_pkod and r1.r_kod=r2.r_kod
)
работает действительно долго, но при этом еще и некорректно(.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643434
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezСпасибо за помощь!
У Вас запрос был написан с небольшими помарками. Я исправил
авторselect r_kod, in_date, in_pkod
from goods_r r1, invoice i1
where i1.in_key=r1.r_key
and i1.in_pkod= 'А01'
and in_date = (
select max(in_date)
from goods_r r2, invoice i2
where i2.in_key=r2.r_key and i1.in_pkod=i2.in_pkod and r1.r_kod=r2.r_kod
)
работает действительно долго, но при этом еще и некорректно(.

За некорректность прошу прощения, там действительно опечатка есть.
А вот на счет не правильно , тут можно поспорить, запрос работает в соответствии с поставленной Вами задачей. Целью моего примера было показать Вам, что при данной постановке задачи
можно использовать коррелированный подзапрос в запросе. Зная что его можно использовать
добиться правильности это уже Ваша работа, Вам за нее деньги платят.

Вопрос скорости это уже другая тема, я предупреждал, что может быть долго, так как неизвестно какие индексы у Вас там построены.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643461
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezработает ... некорректно(.

AnatoLoyr_key - это точно поле внешнего ключа в таблице goods_r на таблицу invoice?
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643568
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том что я топтался в самом начале возле того же)
Как раз таки я пока не знаю как наложить условие что именно А01 является последним поставщиком . Буду признателен если покажите в какую сторону смотреть.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643577
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойIvan_kezработает ... некорректно(.

AnatoLoyr_key - это точно поле внешнего ключа в таблице goods_r на таблицу invoice?

абсолютно!
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643583
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос жуется с пятницы. Однако таки все таки воспользуйтесь советом из ФАК-а. Создайте тестовый пример и поместите здесь. Мне лично не лень поэксперементировать с запросом, но подготавливать данные для него облом, тем более, если в итоге окажется, что я неправильно понял ваше описание структуры таблиц.
Опять таки, мой вопрос остался без ответа.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643657
2 Автор
внешнее левое соединение тебе в помощь...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35643718
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DaugavaА написать свою процедуру нельзя?
Еще одно, у товаров и накладных id надеюсь есть? Или в течение дня один товар может быть поставлен только одним поставщиком и только один раз?
процедуру написать невозможно ибо нет прав.
в таблице invoice (таблица шапок накладных) id - in_key
в таблице goods_r (таблица тел накладных) уникальных полей нет.
Товар может поставляться сколько угодно раз любым поставщиком.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644093
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Покажите в чём некорректность запроса, привдённого "onstat-"...
2. Добавьте в запрос алиасы ко всем именам столбцов...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644544
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
некорректно отрабатывает - не выполняется условие Выбрать весь товар, последним поставщиком которого является поставщик с кодом "А01"
т.е. выбирается товар поставщика А01,а за тем из него цепляется максимальная дата.
Задача немного в другом...
Поставщиков много и один товар могут поставлять 3 (или более) поставщика
Код: plaintext
1.
2.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 06 . 2006     ВЩБ
соответственно такой товар не нужен т.к. согласно задаче нужно что бы последним поставщиком был А01

Код: plaintext
1.
2.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 06 . 2006     А01
а вот такой товар должен попасть под выборку.

Алиасы добавил!
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644660
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezЗадача немного в другом...
Мы от Вас и добиваемся постановки этой задачи :)

Ivan_kez
Поставщиков много и один товар могут поставлять 3 (или более) поставщика
Код: plaintext
1.
2.
3.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 06 . 2006     ВЩБ
соответственно такой товар не нужен т.к. согласно задаче нужно что бы последним поставщиком был А01
Код: plaintext
1.
2.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 06 . 2006     А01
а вот такой товар должен попасть под выборку.


В обоих примерах - последним поставшиком исходя из даты был Ы22....
Спокойно соберитесь с мыслями - и не спеша напишите постановку задачи с примерами ...
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644687
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_kez
но дергать максимальную дату

Эта дата в поле in_date?

Ivan_kez
102562 10.06.2006 А01
102562 02.11.2006 Ы22
102562 10.06.2006 А01

а вот такой товар должен попасть под выборку.

10.06.2006 более "последняя", чем 02.11.2006??
или опечатка или ??
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644710
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за терпение!
Попробую еще раз сформулировать попонятнее)
invoice - шапки накладных
goods_r - тело накладных
связаны по in_key (первичный ключ из таблицы шапок) и r_key (внешний ключ из таблицы тел накладных) соответственно.
in_ttype - тип накладной. "1" символизирует приход.
in_pkod - код поставщика.
r_kod - товар.

(!)Один и тот же товар могут поставлять разные поставщики.

Задача:
Выбрать все товары, приходившие не важно от скольки и каких поставщиков, но главное что бы последним поставщиком был А01

1.Пример первый. Товар поставлялся 3 раза от разных поставщиков - такой товар не должен попасть под выборку потому что 10.06.2006>10.05.2006
Код: plaintext
1.
2.
 102562      10 . 05 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 06 . 2006     ВЩБ

2.Второй пример. Такой товар должне попасть под выборку 10.07.2006>02.11.2006
Код: plaintext
1.
2.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 07 . 2006     А01

Я дошел вот до такого момента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT
    r_kod,
    in_date,
    in_pkod
FROM
    invoice,
    goods_r
WHERE
    in_ttype= 1 
AND
    in_key=r_key
AND
    r_kod
IN (
    SELECT
        r_kod
    FROM
        invoice,
        goods_r
    WHERE
        in_pkod='А01'
    AND
        in_ttype= 1 
    AND
        in_key=r_key
    )
    ORDER BY
        r_kod

На выходе запроса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 100561 	 2006 - 04 - 11 		А01
 100561 	 2006 - 08 - 15 		А01
 100561 	 2008 - 04 - 07 		ююt
 100561 	 2006 - 02 - 21 		А01
 100563 	 2007 - 06 - 20 		А01
 100563 	 2007 - 05 - 30 		А01
 100563 	 2006 - 06 - 21 		А01
 100563 	 2006 - 02 - 21 		А01
 100564 	 2008 - 08 - 21 		ююt
 100564 	 2008 - 06 - 20 		ююt
 100564 	 2006 - 04 - 11 		А01
 100564 	 2006 - 02 - 21 		А01
Вложенный запрос создан для ограничения списка товаров(т.е. выбираем все товары, которые приходили когда-либо от нужного нам поставщика). Дальше по получившимся товарам выбираем все приходы с датой и поставщиком.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644714
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ollegIvan_kez
но дергать максимальную дату

Эта дата в поле in_date?

Ivan_kez
102562 10.06.2006 А01
102562 02.11.2006 Ы22
102562 10.06.2006 А01

а вот такой товар должен попасть под выборку.

10.06.2006 более "последняя", чем 02.11.2006??
или опечатка или ??
опечатка, но суть не меняется - не должен ибо по дате последним поставщиком был Ы22
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644723
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kez
2.Второй пример. Такой товар должне попасть под выборку 10.07.2006>02.11.2006
Код: plaintext
1.
2.
 102562      10 . 06 . 2006     А01
 102562      02 . 11 . 2006     Ы22
 102562      10 . 07 . 2006     А01

Вы опять невнимательны...
Или же парите нам даты в формате MM.DD.YYYY
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644757
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SELECT r1.r_kod   -- код товара
     , i1.in_date -- дата накладной
     , i1.in_pkod -- код поставщика
  FROM goods_r r1 -- строки накладных
     , invoice i1 -- накладные
    WHERE i1.in_key = r1.r_key -- соединием
      -- фильтруем
      -- Если накладная от A01
      AND i1.in_pkod = "А01"
      -- и это приход 
      AND i1.in_ttype =  1 
      -- и дата накладной, такая что соответствует
      AND i1.in_date = (
            -- Максимальной дате поставки 
            -- указанного товара
            -- каким угодно поставщиком
            SELECT max(i2.in_date) -- "Максимальной дате поставки "
              FROM goods_r r2
                 , invoice i2
                WHERE i2.in_key = r2.r_key 
                  AND r1.r_kod = r2.k_kod -- "указанного товара"
                  -- далее идёт единственное отличие от кода, приведённого "onstat-"
                  -- след. условие с in_pkod закомментирован, 
                  -- так как подзапрос должен выдавать макс дату поставки "каким угодно поставщиком"
                  -- AND i1.in_pkod = i2.in_pkod  
                  -- и не забыть про приходы
                  AND i2.in_ttype =  1 

          )

Не хотите Вы думать, уважаемый топикстартер...
Купить и вдумчиво на ночь медленно читать "SQL для профессионалов"...
И именно "купить" - чтобы был финансовый мотив для "читать" :)
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644848
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644914
Ivan_kez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу объяснить мне пожалуйста почему функция max() возвращает не одно значение, а список?
Ведь даже название функции говорит о том что возв. значение должно быть одно.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644937
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezБольшое спасибо.

Спасибо это много :)
Что бы отложилось на будущее у Вас в мозгах , а также что бы принести
пользу Informix сообществу предлагаю Вам все, что Вы поняли из этого топика,
оформить в виде FAQ по коррелированным подзапросам.
...
Рейтинг: 0 / 0
Помогите составить запрос.
    #35644940
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_kezПрошу объяснить мне пожалуйста почему функция max() возвращает не одно значение, а список?
Ведь даже название функции говорит о том что возв. значение должно быть одно.

Потому что подзапрос коррелированный.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Informix [игнор отключен] [закрыт для гостей] / Помогите составить запрос.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]