Гость
Форумы / [игнор отключен] [закрыт для гостей] / Как объединить результат двух запросов? / 23 сообщений из 23, страница 1 из 1
23.11.2017, 14:34
    #39558300
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Всем доброго времени суток. Есть два запроса в пакете. Никак не соображу, как мне результаты этих запросов вывести в одну таблицу. Если делать так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Номенклатура.Производитель КАК ПроизводительНовинка,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК НоменклатураНовинка,
    ПоступлениеТоваровУслугТовары.Количество КАК КоличествоИзПоступления,
    ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмеренияИзПоступления,
    ПоступлениеТоваровУслугТовары.Цена КАК ЦенаИзПоступления,
    ПоступлениеТоваровУслугТовары.Сумма КАК СуммаИзПоступления,
    ПоступлениеТоваровУслугТовары.Сумма * КурсыВалютСрезПоследних.Курс КАК СуммаРеглИзПоступления
ПОМЕСТИТЬ Новинки
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода, ) КАК КурсыВалютСрезПоследних
        ПО ПоступлениеТоваровУслугТовары.Ссылка.ВалютаДокумента = КурсыВалютСрезПоследних.Валюта
ГДЕ
    ЗначенияСвойствОбъектов.Свойство = &Свойство
    И ЗначенияСвойствОбъектов.Значение = &Значение
    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
    И ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура.Производитель КАК ПроизводительРаспродажа,
    ТоварыНаСкладахОстатки.Номенклатура КАК НоменклатураРаспродажа,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков,
    ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена,
    ТоварыНаСкладахОстатки.КоличествоОстаток * ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК Сумма,
    ТоварыНаСкладахОстатки.КоличествоОстаток * ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс КАК СуммаРегл
ПОМЕСТИТЬ Распродажа
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&КонецПериода, ТипЦен = &Закупочная) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура
            И ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков = ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
    РегистрСведений.КурсыВалют.СрезПоследних(&КонецПериода, ) КАК КурсыВалютСрезПоследних
ГДЕ
    ТоварыНаСкладахОстатки.Склад В(&Склады)
    И ТоварыНаСкладахОстатки.Номенклатура В
            (ВЫБРАТЬ
                КатегорииОбъектов.Объект
            ИЗ
                РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
            ГДЕ
                КатегорииОбъектов.Категория = &Распродажа)
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Новинки.ПроизводительНовинка КАК ОбщийПроизводитель
ПОМЕСТИТЬ Производитель
ИЗ
    Новинки КАК Новинки
 
ОБЪЕДИНИТЬ
 
ВЫБРАТЬ
    Распродажа.ПроизводительРаспродажа
ИЗ
    Распродажа КАК Распродажа
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Производитель.ОбщийПроизводитель КАК ОбщийПроизводитель,
    Новинки.НоменклатураНовинка,
    Новинки.КоличествоИзПоступления КАК КоличествоИзПоступления,
    Новинки.ЕдиницаИзмеренияИзПоступления,
    Новинки.ЦенаИзПоступления КАК ЦенаИзПоступления,
    Новинки.СуммаИзПоступления КАК СуммаИзПоступления,
    Новинки.СуммаРеглИзПоступления КАК СуммаРеглИзПоступления,
    Распродажа.НоменклатураРаспродажа,
    Распродажа.КоличествоОстаток КАК КоличествоОстаток,
    Распродажа.НоменклатураЕдиницаХраненияОстатков,
    Распродажа.Цена КАК ЦенаРаспродажа,
    Распродажа.Сумма КАК СуммаРаспродажа,
    Распродажа.СуммаРегл КАК СуммаРеглРаспродажа
ИЗ
    Производитель КАК Производитель
        ПОЛНОЕ СОЕДИНЕНИЕ Новинки КАК Новинки
        ПО Производитель.ОбщийПроизводитель = Новинки.ПроизводительНовинка
        ПОЛНОЕ СОЕДИНЕНИЕ Распродажа КАК Распродажа
        ПО Производитель.ОбщийПроизводитель = Распродажа.ПроизводительРаспродажа
ИТОГИ
    СУММА(КоличествоИзПоступления),
    СУММА(ЦенаИзПоступления),
    СУММА(СуммаИзПоступления),
    СУММА(СуммаРеглИзПоступления),
    СУММА(КоличествоОстаток),
    СУММА(ЦенаРаспродажа),
    СУММА(СуммаРаспродажа),
    СУММА(СуммаРеглРаспродажа)
ПО
    ОБЩИЕ,
    ОбщийПроизводитель



То у меня строки задваиваются в тех местах, где распродаж меньше чем новинок и наоборот. Как сделать так, чтоб группировка и итоги считались по производителю, а новинка и распродажа находились в одной строке, только если это один и тот же товар?
Например так:
- Производитель1
--- Товар1 | NULL
--- Товар2 | NULL
--- NULL | Товар3
--- Товар4 | Товар4
--- NULL | Товар5

Заранее всем спасибо.

P.S. Платформа 8.2
...
Рейтинг: 0 / 0
23.11.2017, 15:06
    #39558338
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Всё, уже не надо.
...
Рейтинг: 0 / 0
23.11.2017, 15:55
    #39558419
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoyaВсё, уже не надо.ну ведь потомки будут искать, найдут твою тему. Некрасиво. когда нет ответа.

Для потомков:
...
Рейтинг: 0 / 0
23.11.2017, 17:48
    #39558522
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Владимир Лазурко, спасибо, мне тоже пригодится!

Для потомков - в моём случае нужно было сделать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ИЗ
    Производитель КАК Производитель
        ПОЛНОЕ СОЕДИНЕНИЕ Новинки КАК Новинки
        ПО Производитель.ОбщийПроизводитель = Новинки.ПроизводительНовинка
            И Производитель.НоменклатураНовинка = Новинки.НоменклатураНовинка
        ПОЛНОЕ СОЕДИНЕНИЕ Распродажа КАК Распродажа
        ПО Производитель.ОбщийПроизводитель = Распродажа.ПроизводительРаспродажа
            И Производитель.НоменклатураНовинка = Распродажа.НоменклатураРаспродажа
...
Рейтинг: 0 / 0
24.11.2017, 09:15
    #39558741
sWinTyz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Точно?
Юнион олл правильно используете?
Не морочте голову потомкам
...
Рейтинг: 0 / 0
24.11.2017, 09:43
    #39558755
sWinTyz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Я бы написал этот запрос по другому
...
Рейтинг: 0 / 0
24.11.2017, 11:23
    #39558842
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
sWinTyz, а как по другому?
...
Рейтинг: 0 / 0
26.11.2017, 18:02
    #39559666
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoyasWinTyz, а как по другому?Прежде всего озвучьте конечную цель запроса.
Ведь "соединить" можно по-разному, исходя из требоуемого результата.
...
Рейтинг: 0 / 0
27.11.2017, 13:49
    #39559973
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Владимир Лазурко,

Конечная цель запроса:
1. Выбрать все товары с определённым свойством, которые есть в поступлениях за определённый период (новинки).
2. Выбрать все товары с определённой категорией, которые есть на складах на конец периода (распродажа).
3. Выбрать все товары с той же категорией, которые продавались за период, независимо от того, есть они в наличие или нет.
4. Выбрать все продажи по товарам из 1-ой таблицы.
Всё это соединить в одну таблицу по производителю.
Например:
Новинок Распродаж Продано новинок Продано распродаж
-Производитель1 10 15 1 3
--Товар1 10 0 1 0
--Товар2 0 5 0 3
--Товар3 0 10 0 0
...
Рейтинг: 0 / 0
27.11.2017, 14:55
    #39560027
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoya , Да. Полных соединений и декартовых произведений таблиц по старому стилю (через запятую) я в 1С запросах давно не видел. Всегда хватало Внутреннего, Левого и Объединения.
Кстати вы представляете, во что развернет ваш запрос 1С при трансляции MSSQL? Куча записей через через две точки в соединениях, подзапросы соединяются с подзапросами. И в конце FULL JOIN ом соединяете таблицы, а итоговая обработка запроса передается серверу 1С, в секции Итоги По.
Лучше все таки переписать запрос, от греха подальше, особенно если БД высоко нагружена.
...
Рейтинг: 0 / 0
27.11.2017, 16:27
    #39560089
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoya,

"Пять способов подстегнуть производительность SQL" Джонни ПапаПочему-то декартовы произведения (CROSS JOIN) пользуются
дурной славой, и разработчиков зачастую призывают вообще отказаться от
них. Во многих случаях CROSS JOIN действительно приводят к неэффек-
тивному использованию ресурсов. Но их надо применять с умом — как и
любой другой инструмент SQL.
....
CROSS JOIN следует использовать с осторожностью, так как его выпол-
нение требует очень много ресурсов. Например, результат, достигаемый
запросом CROSS JOIN, в котором применяются блоки WHERE, DISTINCT
или GROUP BY, отфильтровывающие большинство строк, можно
получить гораздо более эффективным внутренним объединением (INNER
JOIN). Декартовы произведения очень полезны, когда вам нужны сово-
купные данные, например для построения графика. Но для других задач
декартовы произведения лучше не использовать — в большинстве случа-
ев внутренние объединения гораздо эффективнее.


Мешать стили - часть запросов с joint, а часть через запятую во from - дурной тон.
...
Рейтинг: 0 / 0
28.11.2017, 11:23
    #39560412
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
vitkhv, спасибо, но как в итоге в моём случае нужно переписать запрос, чтоб он не нагружал базу, но выдавал верный результат? Ведь внутреннее соединение тут не подойдёт.
...
Рейтинг: 0 / 0
28.11.2017, 12:08
    #39560453
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoya,
Давайте начнем с того, что внутреннее соединение всегда эффективней внешних. Но если с точки зрения логики мы не можем использовать внутреннее, тогда используем Левое. Все остальные соединения лучше не используем. Например в случае использования правого соединения велик шанс получить план с хэш джоином, там где могут быть более эффективные вложенные циклы.

Что касается первого запроса :
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
Меняем на ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
И ЗначенияСвойствОбъектов.Свойство = &Свойство
И ЗначенияСвойствОбъектов.Значение = &Значение


Соответсвенно это:
Код: sql
1.
2.
ЗначенияСвойствОбъектов.Свойство = &Свойство
         И ЗначенияСвойствОбъектов.Значение = &Значение

убираем из где.



Наводка вместо Полных соединений используем
Код: sql
1.
UNION ALL

и
Код: sql
1.
GROUP BY

. Таблица Производитель вообще не нужна.

Убираем из ГДЕ и переносим в параметры виртульной таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ТоварыНаСкладахОстатки.Склад В(&Склады)
    И ТоварыНаСкладахОстатки.Номенклатура В
            (ВЫБРАТЬ
                КатегорииОбъектов.Объект
            ИЗ
                РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
            ГДЕ
                КатегорииОбъектов.Категория = &Распродажа)


Либо вообще формируем это через временную таблицу, а потом уже передаем во временную, так будет еще эффективней и можно добавить доп поля.

Избавляемся от двух точек.
...
Рейтинг: 0 / 0
28.11.2017, 12:30
    #39560471
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoya,
Ну и смотрим планы, без этого оптимизировать тяжело.
...
Рейтинг: 0 / 0
28.11.2017, 15:17
    #39560620
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoya,
Да и еще забыл: Полусоединения используйте тоже на ряду с внутренним и левым.
Вот это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
ТоварыНаСкладахОстатки.Номенклатура В
            (ВЫБРАТЬ
                КатегорииОбъектов.Объект
            ИЗ
                РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
            ГДЕ
                КатегорииОбъектов.Категория = &Распродажа)


С большой вероятностью Вызовет физическое полусоединение. Но для явного вызова логического полусоединения Exist. В 1С можно написать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
(Номенклатура, Истина) В
            (ВЫБРАТЬ
                КатегорииОбъектов.Объект, ИСТИНА
            ИЗ
                РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
            ГДЕ
                КатегорииОбъектов.Категория = &Распродажа)
...
Рейтинг: 0 / 0
28.11.2017, 16:01
    #39560666
vitkhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
...
Рейтинг: 0 / 0
28.11.2017, 17:59
    #39560773
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
vitkhv, спасибо большое, попробую по Вашим рекомендациям запрос переписать, о результате отпишусь обязательно.
...
Рейтинг: 0 / 0
01.12.2017, 15:18
    #39562609
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
vitkhvLittleLoya,
Что касается первого запроса :
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
Меняем на ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
И ЗначенияСвойствОбъектов.Свойство = &Свойство
И ЗначенияСвойствОбъектов.Значение = &Значение


Соответсвенно это:
Код: sql
1.
2.
ЗначенияСвойствОбъектов.Свойство = &Свойство
         И ЗначенияСвойствОбъектов.Значение = &Значение

убираем из где.
Спасибо, это сделала.

vitkhvТаблица Производитель вообще не нужна.

Как это не нужна? Я же по ней объединяю товары и производителей, по которым будет группировка. Дело в том, что новинки и распродажа могут пересекаться по товарам только в случае ошибки в данных, а в теории они всегда разные, т.к. новинка не может быть распродажей и наоборот.

vitkhv
Либо вообще формируем это через временную таблицу, а потом уже передаем во временную, так будет еще эффективней и можно добавить доп поля.

Вынесла в отдельную временную таблицу, спасибо.

vitkhvLittleLoya,
Ну и смотрим планы, без этого оптимизировать тяжело.

А что за планы?
...
Рейтинг: 0 / 0
01.12.2017, 15:30
    #39562623
Пришелец-прораб
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
vitkhvПолных соединений и декартовых произведений таблиц по старому стилю (через запятую) я в 1С запросах давно не видел

за "через запятую" можно некисло отхватить граблями по спине если одна из таблиц будет пуста
...
Рейтинг: 0 / 0
01.12.2017, 15:31
    #39562625
Пришелец-прораб
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoyaА что за планы?

http://www.gilev.ru/optimquery/
...
Рейтинг: 0 / 0
01.12.2017, 17:48
    #39562776
LittleLoya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
О каких запятых идёт речь? Я больше половины слов и фраз из комментариев не понимаю :(
...
Рейтинг: 0 / 0
03.12.2017, 23:06
    #39563378
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
Пришелец-прорабvitkhvПолных соединений и декартовых произведений таблиц по старому стилю (через запятую) я в 1С запросах давно не виделА В ИЕРАРХИИ по одной или нескольким группам иерархического справочника?
...
Рейтинг: 0 / 0
03.12.2017, 23:07
    #39563379
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить результат двух запросов?
LittleLoyaО каких запятых идёт речь? Я больше половины слов и фраз из комментариев не понимаю :(Не заморачивайтесь сегодня, когда что-то можно понять завтра. © Я.
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Как объединить результат двух запросов? / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]