Имя: Пароль:
1C
 
Помогите с запросом
,
0 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)?
1 mikecool
 
28.04.21
09:36
левое соединение по NULL
2 Admin_Net_1C
 
28.04.21
09:42
(1) делаю

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

пустая таблица. Что и логично, т.к. в ВТ_УникальныеДаты все даты периода
3 mikecool
 
28.04.21
09:43
(2) так сделай наоборот, в чем проблема?
4 Admin_Net_1C
 
28.04.21
09:45
(3)

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

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

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

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

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


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


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

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

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

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

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


ВЫБРАТЬ
    втМаксДаты.Поставщик,
    втМаксДаты.Период,
    ВТ.Значение
ИЗ
    втМаксДаты КАК втМаксДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсходныеДанные КАК ВТ
        ПО втМаксДаты.Поставщик = ВТ.Поставщик
                    И втМаксДаты.МаксПериод = ВТ.Период
ПОМЕСТИТЬ ВТ_ОтсутствующиеДатыПоПоставщикам
ГДЕ
    ВТ.Значение ЕСТЬ NULL
21 dmt
 
28.04.21
11:16
(20) в (19) косяк, максимальную дату надо искать внутри поставщика:

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

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