|
Запрос - Научите "красиво" объединять в запросе (Соединения двух таблиц по периоду) | ☑ | ||
---|---|---|---|---|
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) Ого, я без двух стаканов не готов разобраться тут... буду учить ;)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |