Вход | Регистрация
 

Помогите с запросом

Помогите с запросом
Я
   Admin_Net_1C
 
28.04.21 - 09:35
Добрый день народ.
Есть таблица вида:
Поставщик  | Период | Значение
Поставщик1 |  01    |    10
Поставщик2 |  01    |    11
Поставщик1 |  03    |    8
Поставщик2 |  02    |    12

Нужно получить по каждому поставщику на каждую дату в рамках всего интервала (01-03) соответствующее значение.

Выбрал уникальные даты:

ВЫБРАТЬ РАЗЛИЧНЫЕ
  ВТ_ИсходныеДанные.Период
ПОМЕСТИТЬ ВТ_УникальныеДаты    
ИЗ
  ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные


Дальше не могу сообразить, как получить даты, которых нет у поставщика (т.е. Поставщик1 - 02; Поставщик2 - 03)?
   mikecool
 
1 - 28.04.21 - 09:36
левое соединение по NULL
   Admin_Net_1C
 
2 - 28.04.21 - 09:42
(1) делаю
ВЫБРАТЬ
    ВТ_ИсходныеДанные.Поставщик,
    ВТ_ИсходныеДанные.Период    
ИЗ
    ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УникальныеДаты КАК ВТ_УникальныеДаты
        ПО ВТ_УникальныеДаты.Период = ВТ_ИсходныеДанные.Период
ГДЕ
    ВТ_ИсходныеДанные.Период ЕСТЬ NULL

пустая таблица. Что и логично, т.к. в ВТ_УникальныеДаты все даты периода
   mikecool
 
3 - 28.04.21 - 09:43
(2) так сделай наоборот, в чем проблема?
   Admin_Net_1C
 
4 - 28.04.21 - 09:45
(3)
ВЫБРАТЬ
    ВТ_ИсходныеДанные.Поставщик,
    ВТ_ИсходныеДанные.Период    
ИЗ
    ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УникальныеДаты КАК ВТ_УникальныеДаты
        ПО ВТ_УникальныеДаты.Период = ВТ_ИсходныеДанные.Период
ГДЕ
    ВТ_УникальныеДаты.Период ЕСТЬ NULL

также пустую выдает
   mikecool
 
5 - 28.04.21 - 09:50
(4) ээээ, я так понимаю, что ты вообще не понимаешь сути запроса?
   Classic
 
6 - 28.04.21 - 09:50
(0)
"Нужно получить по каждому поставщику на каждую дату в рамках всего интервала (01-03) соответствующее значение."

Так у тебя именно это и есть в изначальной таблице
   mikecool
 
7 - 28.04.21 - 09:50
ВЫБРАТЬ
    ВТ_ИсходныеДанные.Поставщик,
    ВТ_ИсходныеДанные.Период    
ИЗ
    ВТ_УникальныеДаты КАК ВТ_УникальныеДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные
        ПО ВТ_УникальныеДаты.Период = ВТ_ИсходныеДанные.Период
ГДЕ
    ВТ_ИсходныеДанные.Период ЕСТЬ NULL

наоборот - это так
   Admin_Net_1C
 
8 - 28.04.21 - 09:51
(5) видимо) затуп жесткий сегодня)
   mikecool
 
9 - 28.04.21 - 09:51
(6) "Дальше не могу сообразить, как получить даты, которых нет у поставщика (т.е. Поставщик1 - 02; Поставщик2 - 03)?" у него с дальше проблемы
   Admin_Net_1C
 
10 - 28.04.21 - 09:52
(7) пустая таблица возвращается)
   Admin_Net_1C
 
11 - 28.04.21 - 09:53
По идее у меня в ВТ_УникальныеДаты ВСЕ ДАТЫ из диапазона и как бы я левым соединением по периоду не цеплял к ВТ_ИсходныеДанные, у меня NULL не будет. Или я не догоняю чего-то сегодня)
   Admin_Net_1C
 
12 - 28.04.21 - 09:55
(9) эм... где у меня в исходной таблице ?
Поставщик1 | 02 | 10
Поставщик2 | 03 | 12
   hhhh
 
13 - 28.04.21 - 10:01
(7)  ВЫБРАТЬ
    ВТ_ИсходныеДанные.Поставщик,
    ВТ_ИсходныеДанные.Период

это что? И ежу ведь понятно  ВТ_ИсходныеДанные.Период ЕСТЬ NULL, зачем выводить ВТ_ИсходныеДанные.Период ??
   Admin_Net_1C
 
14 - 28.04.21 - 10:09
Сделал, ради интереса, без условия:

ВЫБРАТЬ
    ВТ_ИсходныеДанные.Поставщик,
    ВТ_ИсходныеДанные.Период    
ИЗ
    ВТ_УникальныеДаты КАК ВТ_УникальныеДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные
        ПО ВТ_УникальныеДаты.Период = ВТ_ИсходныеДанные.Период


Как я предполагал в (11), в колонке Период нет значения NULL. Потом в этом запросе поменял местами ВТ_УникальныеДаты <-> ВТ_ИсходныеДанные, результат аналогичный предыдущему - нет NULL в колонке период.
Как мне кажется здесь не все так просто, а вот как именно не могу сообоазить)
   osa1C
 
15 - 28.04.21 - 10:19
(14) ты скажи внятно, что тебе надо? Вангую, период это у тебя месяц, а тебе надо таблицу с каждой датой месяца  и соответствующим значением, так?
   Admin_Net_1C
 
16 - 28.04.21 - 10:24
(15) период у меня вообще может быть не ограничен. Есть таблица (1) как получить по поставщику "пропущенные" даты значение (предыдущее, если оно есть, см (12))?
   Admin_Net_1C
 
17 - 28.04.21 - 10:25
(16).. НА "пропущенные" даты (в разрезе поставщика) значение...
   osa1C
 
18 - 28.04.21 - 10:31
(17) Что такое пропущенные даты? Ты сам то понимаешь что ты хочешь сделать? в твоей приведенной таблице вообще нет дат.
   dmt
 
19 - 28.04.21 - 10:52
(0) как-то так
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Т1.Период,
    Т2.Поставщик
ПОМЕСТИТЬ втКомбинации
ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        ВТ.Период КАК Период
    ИЗ
        ВТ КАК ВТ) КАК Т1,
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        ВТ.Поставщик КАК Поставщик
    ИЗ
        ВТ КАК ВТ) КАК Т2
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    втКомбинации.Поставщик КАК Поставщик,
    втКомбинации.Период КАК Период,
    МАКСИМУМ(ВТ.Период) КАК МаксПериод
ПОМЕСТИТЬ втМаксДаты
ИЗ
    втКомбинации КАК втКомбинации
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО (ВТ.Период <= втКомбинации.Период)

СГРУППИРОВАТЬ ПО
    втКомбинации.Поставщик,
    втКомбинации.Период
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    втМаксДаты.Поставщик,
    втМаксДаты.Период,
    ВТ.Значение
ИЗ
    втМаксДаты КАК втМаксДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО втМаксДаты.Поставщик = ВТ.Поставщик
                    И втМаксДаты.МаксПериод = ВТ.Период

УПОРЯДОЧИТЬ ПО
    втМаксДаты.Поставщик,
    втМаксДаты.Период
   Admin_Net_1C
 
20 - 28.04.21 - 11:10
(19) спасибо тебе добрый человек (+100500 тебе в карму)), чутка модифицировал только последний запрос и как раз получаю то что надо:

ВЫБРАТЬ
    втМаксДаты.Поставщик,
    втМаксДаты.Период,
    ВТ.Значение
ИЗ
    втМаксДаты КАК втМаксДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсходныеДанные КАК ВТ
        ПО втМаксДаты.Поставщик = ВТ.Поставщик
                    И втМаксДаты.МаксПериод = ВТ.Период
ПОМЕСТИТЬ ВТ_ОтсутствующиеДатыПоПоставщикам
ГДЕ
    ВТ.Значение ЕСТЬ NULL

   dmt
 
21 - 28.04.21 - 11:16
(20) в (19) косяк, максимальную дату надо искать внутри поставщика:

ВЫБРАТЬ
    втКомбинации.Поставщик КАК Поставщик,
    втКомбинации.Период КАК Период,
    МАКСИМУМ(ВТ.Период) КАК МаксПериод
ПОМЕСТИТЬ втМаксДаты
ИЗ
    втКомбинации КАК втКомбинации
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО (втКомбинации.Поставщик = ВТ.Поставщик <<< вот здесь
            И ВТ.Период <= втКомбинации.Период)

СГРУППИРОВАТЬ ПО
    втКомбинации.Поставщик,
    втКомбинации.Период
   Admin_Net_1C
 
22 - 28.04.21 - 11:33
(21) нет. Потестил, для моего случая, как раз в (19) все правильно


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.