1.
Lucifer93
9421.06.19 14:14 Сейчас в теме+0.5 $m
Вопрос. Почему данный запрос дублирует строки. Я его, конечно, переписал, но никак не могу понять почему происходило дублирование строк
ВЫБРАТЬ
ПланПоГкТГКОбороты.ГоловнойКонтрагент,
ПланПоГкТГКОбороты.ТоварнаяГруппаКлиента,
ПланПоГкТГКОбороты.СуммаОборот,
ПланПоГкТГКОбороты.ГоловнойКонтрагент.Код
ПОМЕСТИТЬ ОборотПоПлану
ИЗ
РегистрНакопления.ПланПоГкТГК.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПланПоГкТГКОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура.ГруппаДляАналитики,
ВЫБОР
КОГДА ПродажиОбороты.Контрагент.ГоловнойКонтрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ПродажиОбороты.Контрагент
ИНАЧЕ ПродажиОбороты.Контрагент.ГоловнойКонтрагент
КОНЕЦ КАК Контрагент,
ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
ПОМЕСТИТЬ ФактБезГруппировки
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ФактБезГруппировки.НоменклатураГруппаДляАналитики,
ФактБезГруппировки.Контрагент,
СУММА(ФактБезГруппировки.СтоимостьОборот) КАК СтоимостьОборот,
ФактБезГруппировки.Контрагент.Код КАК Код
ПОМЕСТИТЬ Факт
ИЗ
ФактБезГруппировки КАК ФактБезГруппировки
СГРУППИРОВАТЬ ПО
ФактБезГруппировки.Контрагент,
ФактБезГруппировки.НоменклатураГруппаДляАналитики
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА ОборотПоПлану.ГоловнойКонтрагент ЕСТЬ NULL
ТОГДА Факт.Контрагент
ИНАЧЕ ОборотПоПлану.ГоловнойКонтрагент
КОНЕЦ КАК ГоловнойКонтрагент,
ВЫБОР
КОГДА ОборотПоПлану.ТоварнаяГруппаКлиента ЕСТЬ NULL
ТОГДА Факт.НоменклатураГруппаДляАналитики
ИНАЧЕ ОборотПоПлану.ТоварнаяГруппаКлиента
КОНЕЦ КАК ТоварнаяГруппаКлиента,
ОборотПоПлану.СуммаОборот,
ВЫБОР КОГДА ОборотПоПлану.ГоловнойКонтрагентКод Есть Null
Тогда Факт.Код
Иначе
ОборотПоПлану.ГоловнойКонтрагентКод
Конец КАК ГоловнойКонтрагентКод,
Факт.НоменклатураГруппаДляАналитики,
Факт.Контрагент,
Факт.СтоимостьОборот
ПОМЕСТИТЬ ПланИФактПоВсем
ИЗ
ОборотПоПлану КАК ОборотПоПлану
ПОЛНОЕ СОЕДИНЕНИЕ Факт КАК Факт
ПО ОборотПоПлану.ТоварнаяГруппаКлиента = Факт.НоменклатураГруппаДляАналитики
И ОборотПоПлану.ГоловнойКонтрагент = Факт.Контрагент // ТУТ РЕЗУЛЬТАТ 20 СТРОК
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПланИФактПоВсем.ГоловнойКонтрагент,
ПланИФактПоВсем.ТоварнаяГруппаКлиента КАК ТГК,
ПланИФактПоВсем.СуммаОборот КАК План,
ПланИФактПоВсем.ГоловнойКонтрагентКод КАК КодГК, // ТУТ РЕЗУЛЬТАТ 40 СТРОК
ПланИФактПоВсем.СтоимостьОборот КАК Факт
ИЗ
ПланИФактПоВсем КАК ПланИФактПоВсем,
ОборотПоПлану КАК ОборотПоПлану // УБИРАЕМ ДАННУЮ СТРОКУ И ВСЕ РАБОТАЕТ НОРМАЛЬНО, ЕСЛИ ЕЕ ОСТАВИТЬ ПРОИСХОДИТ ДУБЛИРОВАНИЕ СТРОК.
(1) После прочтения книги "Эксперт по технологическим вопросам" такие запросы уже не пишут.
Хотя, если вы научились только цитировать оттуда главы, то еще допустимо ваять такую дичь на всяких демкам без опасения "завалить" систему.
(6) Вы, похоже, совсем не умеете читать. Мне поступил данный запрос на переработку. Мне было всего лишь интересно по какой причине он дублирует строки. Займитесь чем-нибудь полезным, хватит выливать желчь.
По-моему, дублирование происходит из-за двойного обращения к ГоловнойКонтрагент: один раз - как к самостоятельному контрагенту, второй - как к головному у контрагента из выборки.
ОборотПоПлану КАК ОборотПоПлану // УБИРАЕМ ДАННУЮ СТРОКУ И ВСЕ РАБОТАЕТ НОРМАЛЬНО, ЕСЛИ ЕЕ ОСТАВИТЬ ПРОИСХОДИТ ДУБЛИРОВАНИЕ СТРОК.
И правильно, нужно убрать эту сроку, все равно вы из этой таблицы не вытаскиваете ни каких данных и не ограничиваете ею.
Из за нее дублируются строки т.к. в ПланИФактПоВсем 20 строк, а в ОборотПоПлану 2 строки. 20*2 = 40 строк.
(7)
(1) Присоединяюсь к ответу.
Зачем вы добавили временную таблицу ОборотПоПлану, если в итоге ни чего из неё не добавляете?
Либо просто уберите её, либо настройте связи для приличия, по полям ГловонойКонтрагент, и товарная группа
(8) Автор по ходу еще не дозрел до понимания временных таблиц...
Он ее создал и использует в других временных...
Но зачем написал ее в результате - ВОТ вопрос!
(8)
(9)
Вы совсем не умеете читать суть вопроса. Я не писал данный запрос, я получил его на переработку. Меня интересовал принцип задвоения строк. Прежде чем отвечать что-то прочитайте текст вопроса.
ПОЛНОЕ СОЕДИНЕНИЕ - экзотика, ни разу не использовал за всю свою жизнь. Для склейки таблиц "по вертикали" удобнее использовать ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ, а склейку "по горизонтали" удобнее делать из таблицы с ключевыми данными - список номенклатуры, контрагентов, результат запроса - и уже к ней левыми соединениями сразу или пошагово собирать все нужные данные.
С задвоениями есть одна неочевидная "грабля" - если в присоединяемой таблице есть задвоение данных, то оно задвоит и те строки, к которым эти данные будут присоединены. Чтобы такого не случалось, все склонные к задвоениям данные сначала выбираются и помещаются через ВЫБРАТЬ РАЗЛИЧНЫЕ во временные таблицы, а затем их уже можно безопасно соединять с ключевыми данными.