powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / Как объединить результат двух запросов?
23 сообщений из 23, страница 1 из 1
Как объединить результат двух запросов?
    #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
Как объединить результат двух запросов?
    #39558338
LittleLoya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё, уже не надо.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39558419
Фотография Владимир Лазурко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoyaВсё, уже не надо.ну ведь потомки будут искать, найдут твою тему. Некрасиво. когда нет ответа.

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

Для потомков - в моём случае нужно было сделать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ИЗ
    Производитель КАК Производитель
        ПОЛНОЕ СОЕДИНЕНИЕ Новинки КАК Новинки
        ПО Производитель.ОбщийПроизводитель = Новинки.ПроизводительНовинка
            И Производитель.НоменклатураНовинка = Новинки.НоменклатураНовинка
        ПОЛНОЕ СОЕДИНЕНИЕ Распродажа КАК Распродажа
        ПО Производитель.ОбщийПроизводитель = Распродажа.ПроизводительРаспродажа
            И Производитель.НоменклатураНовинка = Распродажа.НоменклатураРаспродажа
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39558741
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно?
Юнион олл правильно используете?
Не морочте голову потомкам
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39558755
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы написал этот запрос по другому
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39558842
LittleLoya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sWinTyz, а как по другому?
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39559666
Фотография Владимир Лазурко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoyasWinTyz, а как по другому?Прежде всего озвучьте конечную цель запроса.
Ведь "соединить" можно по-разному, исходя из требоуемого результата.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #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
Как объединить результат двух запросов?
    #39560027
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoya , Да. Полных соединений и декартовых произведений таблиц по старому стилю (через запятую) я в 1С запросах давно не видел. Всегда хватало Внутреннего, Левого и Объединения.
Кстати вы представляете, во что развернет ваш запрос 1С при трансляции MSSQL? Куча записей через через две точки в соединениях, подзапросы соединяются с подзапросами. И в конце FULL JOIN ом соединяете таблицы, а итоговая обработка запроса передается серверу 1С, в секции Итоги По.
Лучше все таки переписать запрос, от греха подальше, особенно если БД высоко нагружена.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39560089
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoya,

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


Мешать стили - часть запросов с joint, а часть через запятую во from - дурной тон.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39560412
LittleLoya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vitkhv, спасибо, но как в итоге в моём случае нужно переписать запрос, чтоб он не нагружал базу, но выдавал верный результат? Ведь внутреннее соединение тут не подойдёт.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #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
Как объединить результат двух запросов?
    #39560471
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoya,
Ну и смотрим планы, без этого оптимизировать тяжело.
...
Рейтинг: 0 / 0
Как объединить результат двух запросов?
    #39560620
vitkhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LittleLoya,
Да и еще забыл: Полусоединения используйте тоже на ряду с внутренним и левым.
Вот это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
ТоварыНаСкладахОстатки.Номенклатура В
            (ВЫБРАТЬ
                КатегорииОбъектов.Объект
            ИЗ
                РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
            ГДЕ
                КатегорииОбъектов.Категория = &Распродажа)


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


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

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

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

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

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

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

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

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

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

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


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