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

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

ИЗ
    втПлан_ВсеПериоды КАК втПлан_ВсеПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ втРезультат_ВсеПериоды КАК втРезультат_ВсеПериоды
        ПО (втРезультат_ВсеПериоды.Период = втПлан_ВсеПериоды.Период)
        
        
Вроде как я получаю то, что мне нужно. Но мне этот весь подход кажется очень некрасивым. Можно это все сделать проще, красивее, компактнее, и, возможно, быстрее работающее? Научите, пожалуйста!
 
 Партнерская программа EFSOL Oblako
   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 или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.