Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос - Научите "красиво" объединять в запросе (Соединения двух таблиц по периоду)

Запрос - Научите "красиво" объединять в запросе (Соединения двух таблиц по периоду)
Я
   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:
ВЫБРАТЬ
    втВсеПериоды.Период,
    Результат.СуммаФАКТИЧЕСКАЯ
ПОМЕСТИТЬ втРезультат_ВсеПериоды
ИЗ
    втВсеПериоды КАК втВсеПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ Результат КАК Результат
        ПО втВсеПериоды.Период = Результат.Период
        
И последнее:

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

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

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

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