Имя: Пароль:
1C
1С v8
Запрос - Научите "красиво" объединять в запросе (Соединения двух таблиц по периоду)
0 new_hope
 
19.02.20
12:57
Есть две таблицы:

1-я (План):
Период         СуммаПлановая
01-02-2019         100
01-03-2019         150
01-07-2019         350
01-09-2019         600

2-я (Результат):
Период         СуммаФАКТИЧЕСКАЯ
01-01-2019         97
01-04-2019         117
01-09-2019         277

Нужно получить такую таблицу (Общая):
Период         СуммаПлановая      СуммаФАКТИЧЕСКАЯ
01-01-2019           0                   97
01-02-2019         100                    0
01-03-2019         150                    0
01-04-2019           0                  117
01-07-2019         350                    0
01-09-2019         600                  277


Как "красиво" посторить запрос?

Я делаю это так:
Сначала выбираю периоды (объединяю результат), потом последовательно присоединяю обе таблицы к таблице периодов. Верно? То-есть - три запроса.
А как это сделать можно по другому?

Я так делаю, выбираю и объединяю все периоды во временную таблицу:

ВЫБРАТЬ
    План.Период
ПОМЕСТИТЬ втВсеПериоды
ИЗ
    План КАК План

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Результат.Период
ИЗ
    Результат КАК Результат
    
Затем соединяю (последовательно) таблицу "План" с "втВсеПериоды" и таблицу "Результат" с "втВсеПериоды" и каждую помещаю во временную таблицу:

1:
ВЫБРАТЬ
    втВсеПериоды.Период,
    План.СуммаПлановая
ПОМЕСТИТЬ втПлан_ВсеПериоды
ИЗ
    втВсеПериоды КАК втВсеПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ План КАК План
        ПО втВсеПериоды.Период = План.Период

2:
ВЫБРАТЬ
    втВсеПериоды.Период,
    Результат.СуммаФАКТИЧЕСКАЯ
ПОМЕСТИТЬ втРезультат_ВсеПериоды
ИЗ
    втВсеПериоды КАК втВсеПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ Результат КАК Результат
        ПО втВсеПериоды.Период = Результат.Период
        
И последнее:

И, наконец, соединяю "втПлан_ВсеПериоды" и "втРезультат_ВсеПериоды":
ВЫБРАТЬ
    втПлан_ВсеПериоды.Период,
    втПлан_ВсеПериоды.СуммаПлановая КАК СуммаПлановая,
    втРезультат_ВсеПериоды.СуммаФАКТИЧЕСКАЯ КАК СуммаФАКТИЧЕСКАЯ

ИЗ
    втПлан_ВсеПериоды КАК втПлан_ВсеПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ втРезультат_ВсеПериоды КАК втРезультат_ВсеПериоды
        ПО (втРезультат_ВсеПериоды.Период = втПлан_ВсеПериоды.Период)
        
        
Вроде как я получаю то, что мне нужно. Но мне этот весь подход кажется очень некрасивым. Можно это все сделать проще, красивее, компактнее, и, возможно, быстрее работающее? Научите, пожалуйста!
1 catena
 
19.02.20
13:00
Выбрать дата, СуммаПлановая, 0
Объединить все
Выбрать дата, 0, СуммаФАКТИЧЕСКАЯ;
Выбрать Дата, Сумма(СуммаПлановая), Сумма(СуммаФАКТИЧЕСКАЯ)
2 SleepyHead
 
гуру
19.02.20
13:03
Выбрать
    Результат.Период как Период
    0 КАК СуммаПлановая,
    Результат.СуммаФактическая Как СуммаФактическая
Поместить ВТ_Данные
ИЗ Результат КАК Результат
ОБЪЕДИНИТЬ ВСЕ
Выбрать
   План.Период,
   План.СуммаПлановая,
   0
;
Выбрать
   ВТ_Данные.Период,
   Сумма(ВТ_Данные.СуммаПлановая) КАК СуммаПлановая,
   Сумма(ВТ_Данные.СуммаФактическая) КАК СуммаФактическая
ИЗ ВТ_Данные КАК ВТ_Данные
Сгруппировать ПО ВТ_Данные.Период
3 D_E_S_131
 
19.02.20
13:04
Соединение по "Период" должно быть полное, а суммы получить через ЕстьNull().
4 Ёпрст
 
19.02.20
13:33
(0) правильно, как в (1) и..при необходимости, добавить отсутствующие периоды (если нужны)
5 new_hope
 
19.02.20
13:52
(4) А как их добавить (отсутствующие периоды) - даже если ли там по обоим колонкам будет "ноль"?
6 Радим1987
 
19.02.20
13:56
Потом все твое соедини с этим

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОНЕЦПЕРИОДА(КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), МЕСЯЦ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), МЕСЯЦ), МЕСЯЦ) КАК Период
ИЗ
    ВТЦифры КАК Цифры
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ), МЕСЯЦ) > 99)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ), МЕСЯЦ) > 999)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ), МЕСЯЦ) > 9999)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ), МЕСЯЦ) > 99999)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ), МЕСЯЦ) > 9)
ГДЕ
    КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ), МЕСЯЦ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), МЕСЯЦ) МЕЖДУ &ДатаНачала И &ДатаОкончания

УПОРЯДОЧИТЬ ПО
    Период
7 new_hope
 
19.02.20
14:05
(1) Да... все супер вышло! Спасибо!
8 new_hope
 
19.02.20
14:06
(6) Ого, я без двух стаканов не готов разобраться тут... буду учить ;)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший