Убрать повторные комбинации в запросе

1. windsurf 52 18.11.19 21:39 Сейчас в теме
Всем привет)
Ломаю голову, вроде над простой задачей, но не могу сообразить.

Есть запрос, который возвращает результат типа:
Товар1 Товар2
Товар2 Товар1
Товар3 Товар4
Товар4 Товар3

Не могу сообразить, как избавиться от повторных комбинаций, т.к. для целей запроса - они являются повторами.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
29. windsurf 52 19.11.19 10:04 Сейчас в теме
(28) да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.

Оказалось просто... сравнение ссылок

ВЫБРАТЬ
	Рег1.ЗаказПокупателя,
	Рег1.Номенклатура КАК Ном1
ПОМЕСТИТЬ ВТ1
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
;

ВЫБРАТЬ
	ВТ1.Ном1 КАК Ном1,
	ВТ22.Ном1 КАК Ном2,
	1 КАК Колво
ПОМЕСТИТЬ ВТ2
ИЗ
	ВТ1
	ПОЛНОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ22
	ПО ВТ1.ЗаказПокупателя = ВТ22.ЗаказПокупателя
ГДЕ
	ВТ1.Ном1>ВТ22.Ном1
;

ВЫБРАТЬ
	Ном1,
	Ном2,
	КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
ПОМЕСТИТЬ ВТ3
ИЗ ВТ2
СГРУППИРОВАТЬ ПО
	Ном1,
	Ном2
;

ВЫБРАТЬ
	ВТ3.Ном1,
	ВТ3.Ном2,
	ВТ3.КолвоПовторов
ИЗ ВТ3
УПОРЯДОЧИТЬ ПО
	ВТ3.КолвоПовторов Убыв,
	Ном1.Наименование, Ном2.Наименование;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
16. fromlion 172 19.11.19 08:40 Сейчас в теме
(1) согласен, оч интересная задача. Попробовал реализовать и так же, не могу сообразить.
20. fromlion 172 19.11.19 09:19 Сейчас в теме
(1) Вот так получилось
Запрос.Текст =
"ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ВЫБОР
| КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
| ТОГДА ДляТестов.Товар1 + ДляТестов.Товар2
| ИНАЧЕ ДляТестов.Товар2 + ДляТестов.Товар1
| КОНЕЦ КАК СочетаниеВыбора
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ДляТестов.Товар1 + ДляТестов.Товар2 КАК Сочетание
|ПОМЕСТИТЬ ВТОбщая
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ВТОбщая.Товар1 КАК Товар1,
| ВТОбщая.Товар2 КАК Товар2,
| ВТОбщая.Сочетание КАК Сочетание
|ИЗ
| ВТОбщая КАК ВТОбщая
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
| И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
Прикрепленные файлы:
23. windsurf 52 19.11.19 09:39 Сейчас в теме
(20) хороший вариант, но номенклатура - ссылочный тип. Как мы его будем складывать в временной таблице?
24. fromlion 172 19.11.19 09:41 Сейчас в теме
26. windsurf 52 19.11.19 09:42 Сейчас в теме
(24) боюсь, не очень корректный вариант - наименования товаров могут быть или одинаковые или различие в последнем символе, как вариант.
27. fromlion 172 19.11.19 09:44 Сейчас в теме
(26)не складывайте тогда, указывайте код товара в результате сравнения.
28. fromlion 172 19.11.19 09:55 Сейчас в теме +0.75 $m
(26) вот вам пример со ссылочными данными
Запрос.Текст =
"ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ВЫБОР
| КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
| ТОГДА ДляТестов.Товар2.Код + ДляТестов.Товар1.Код
| ИНАЧЕ ДляТестов.Товар1.Код + ДляТестов.Товар2.Код
| КОНЕЦ КАК СочетаниеВыбора
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ДляТестов.Товар1.Код + ДляТестов.Товар2.Код КАК Сочетание
|ПОМЕСТИТЬ ВТОбщая
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ВТОбщая.Товар1 КАК Товар1,
| ВТОбщая.Товар2 КАК Товар2,
| ВТОбщая.Сочетание КАК Сочетание
|ИЗ
| ВТОбщая КАК ВТОбщая
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
| И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
Прикрепленные файлы:
29. windsurf 52 19.11.19 10:04 Сейчас в теме
(28) да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.

Оказалось просто... сравнение ссылок

ВЫБРАТЬ
	Рег1.ЗаказПокупателя,
	Рег1.Номенклатура КАК Ном1
ПОМЕСТИТЬ ВТ1
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
;

ВЫБРАТЬ
	ВТ1.Ном1 КАК Ном1,
	ВТ22.Ном1 КАК Ном2,
	1 КАК Колво
ПОМЕСТИТЬ ВТ2
ИЗ
	ВТ1
	ПОЛНОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ22
	ПО ВТ1.ЗаказПокупателя = ВТ22.ЗаказПокупателя
ГДЕ
	ВТ1.Ном1>ВТ22.Ном1
;

ВЫБРАТЬ
	Ном1,
	Ном2,
	КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
ПОМЕСТИТЬ ВТ3
ИЗ ВТ2
СГРУППИРОВАТЬ ПО
	Ном1,
	Ном2
;

ВЫБРАТЬ
	ВТ3.Ном1,
	ВТ3.Ном2,
	ВТ3.КолвоПовторов
ИЗ ВТ3
УПОРЯДОЧИТЬ ПО
	ВТ3.КолвоПовторов Убыв,
	Ном1.Наименование, Ном2.Наименование;
Показать
31. spacecraft 19.11.19 10:10 Сейчас в теме
(29) обязательно выводить все пары, или достаточно просто количество уникальных пар?
Для просто количество пар задача решается элементарно:
ВЫБРАТЬ
	Рег1.Номенклатура КАК Номенклатура,
	1 Как НомерСтроки
ПОМЕСТИТЬ ВТ1
ИЗ
	РегистрНакопления.ЗаказыКлиентов.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1

СГРУППИРОВАТЬ ПО
	Рег1.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Количество(ВТ1.НомерСтроки)*(Количество(ВТ1.НомерСтроки)-1)/2 КАК КоличествоПар

ИЗ
	ВТ1 КАК ВТ1
Показать
33. windsurf 52 19.11.19 10:48 Сейчас в теме
(31) количество уникальных пар, которые встречались в пределах одного заказа. И сколько раз такие сочетания повторялись в разных заказах
34. Sapiens_bru 4 19.11.19 11:02 Сейчас в теме
Приложенная обработка решает задачу.
Суть решения - Используем объединение с той же таблицей, по перевернутому набору полей.
Для объединения нам понадобится уникальный номер каждой строки. В 8.3.13 это можно сделать как я через АВТОНОМЕРЗАПИСИ() , в более старых платформах можно использовать для нумерации строк метод соединения таблицы самой с собой, либо поискать среди имеющихся записей нечто подходящее под ключ записи. Например в случае справочника Номенклатура это может быть код номенклатуры1 + код номенклатуры2.
Прикрепленные файлы:
УдалениеДублейПоПересечениюПолей.epf
2. Fox-trot 158 18.11.19 22:00 Сейчас в теме
(1) может выбрать различные?
3. windsurf 52 18.11.19 22:14 Сейчас в теме
(2) не, для самого запроса, это разные строки
4. _Lilka 18.11.19 22:29 Сейчас в теме
5. starik-2005 3036 18.11.19 22:33 Сейчас в теме
В данном случае дубли, как я понял, всегда когда товар 1 = товар 2 и товар 2 = товар 1. Таким образом можно получить все товары, у которых есть дубликаты - через банальное левое соединение. Но оставить, предположу, нужно лишь те, в которых товар 1 > товар 2 (или наоборот).
6. windsurf 52 18.11.19 22:41 Сейчас в теме
Это запрос, сам достаточно простой.
ВЫБРАТЬ
	Рег1.Номенклатура КАК Ном1,
	Рег2.Номенклатура КАК Ном2,
	1 КАК Колво
ПОМЕСТИТЬ ВТ1
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
	ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
	ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
ГДЕ
	Рег1.Номенклатура<>Рег2.Номенклатура;

ВЫБРАТЬ
	Ном1,
	Ном2,
	КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
ИЗ ВТ1
СГРУППИРОВАТЬ ПО
	Ном1,
	Ном2
УПОРЯДОЧИТЬ ПО
	КолвоПовторов Убыв
Показать
8. spacecraft 18.11.19 22:50 Сейчас в теме
(6) полное соединение по не всем измерениям? Переделывайте на левое.
11. windsurf 52 18.11.19 23:23 Сейчас в теме
(8) в данном случае, это задачу не решит. Т.к. в документах заполнены только эти реквизиты.
9. spacecraft 18.11.19 22:52 Сейчас в теме
(6) да и сам факт соединения виртуальной таблицы саму на себя...
Выбирайте результат виртуальной таблицы во временную и уже дальше работайте с полученным результатом.
10. windsurf 52 18.11.19 22:54 Сейчас в теме
(9) оптимизация - да, но сейчас для простоты запроса пока так оставил
17. Fox-trot 158 19.11.19 08:44 Сейчас в теме
(6) в запросе не хватает регистратора, если речь о каждом заказе в отдельности
7. пользователь 18.11.19 22:47
Сообщение было скрыто модератором.
...
12. _Lilka 18.11.19 23:25 Сейчас в теме
а какая задача у вас стоит?
13. windsurf 52 18.11.19 23:34 Сейчас в теме
(12) получить количество повторов всех возможных пар номенклатуры, который встречались в пределах одного заказа. Это я посчитал. Сейчас борюсь с дублями строк.
14. acanta 18.11.19 23:39 Сейчас в теме
Простите, но как правило если вы получили данные с которыми ничего не можете сделать, значит надо получить другие данные, с которыми вы знаете что делать. Исправьте исходный запрос так, чтобы он всегда получал
товар 1 товар 2
Товар 1 товар 2
И группируйте.
https://helpme1c.ru/soedineniya-v-zaprosax-v-1s-8-v-primerax
Прикрепленные файлы:
15. _Lilka 19.11.19 00:10 Сейчас в теме
Тоже нахождения Повторов
ВЫБРАТЬ
ВложенныйЗапрос.ЗаказПокупателя,
ВложенныйЗапрос.Номенклатура,
КОЛИЧЕСТВО(ВложенныйЗапрос.Номенклатура) КАК КвоПовторов
ИЗ
(ВЫБРАТЬ
ЗаказыПокупателейОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
ЗаказыПокупателейОбороты.Номенклатура КАК Номенклатура,
ЗаказыПокупателейОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ) КАК ЗаказыПокупателейОбороты) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.ЗаказПокупателя,
ВложенныйЗапрос.Номенклатура
18. windsurf 52 19.11.19 09:11 Сейчас в теме
(15) нет, вы повторы нашли одной номенклатуры в разных заказах. Я говорил про парные повторы. Т.е. сколько раз все возможные варианты пар номенклатуры встречались в разных заказах. Именно по этой причине номенклатур у меня 2 в запросе.
19. dhurricane 19.11.19 09:15 Сейчас в теме
(18) Мне кажется, Вам подойдет совет из (5):
ВЫБРАТЬ
    Рег1.Номенклатура КАК Ном1,
    Рег2.Номенклатура КАК Ном2,
    1 КАК Колво
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
    ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
ГДЕ
    Рег1.Номенклатура < Рег2.Номенклатура;
Показать
35. _Lilka 19.11.19 11:35 Сейчас в теме
(18) это повторы в рамках заказа по разной характеристике
21. KapasMordorov 428 19.11.19 09:21 Сейчас в теме +0.75 $m
22. vugluscr1991 12 19.11.19 09:22 Сейчас в теме
ВЫБРАТЬ
	Рег1.Номенклатура КАК Ном1,
	Рег2.Номенклатура КАК Ном2,
	1 КАК Колво
ПОМЕСТИТЬ ВТ1
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
		ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
		ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
ГДЕ
	Рег1.Номенклатура <> Рег2.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.Ном1,
	ВТ1.Ном2,
	КОЛИЧЕСТВО(ВТ1.Колво) КАК КолвоПовторов
ПОМЕСТИТЬ ПОЛУФАБРИКАТ
ИЗ
	ВТ1 КАК ВТ1

СГРУППИРОВАТЬ ПО
	ВТ1.Ном1,
	ВТ1.Ном2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОЛУФАБРИКАТ.Ном1,
	ПОЛУФАБРИКАТ.Ном2,
	ВЫБОР
		КОГДА ПОЛУФАБРИКАТ.Ном1 = ПОЛУФАБРИКАТ.Ном2
			ТОГДА ПОЛУФАБРИКАТ.КолвоПовторов / 2
		ИНАЧЕ ПОЛУФАБРИКАТ.КолвоПовторов
	КОНЕЦ КАК Поле1
ИЗ
	ПОЛУФАБРИКАТ КАК ПОЛУФАБРИКАТ
		ЛЕВОЕ СОЕДИНЕНИЕ ПОЛУФАБРИКАТ КАК ПОЛУФАБРИКАТ1
		ПО ПОЛУФАБРИКАТ.Ном1 = ПОЛУФАБРИКАТ1.Ном2
			И ПОЛУФАБРИКАТ.Ном2 = ПОЛУФАБРИКАТ1.Ном1
			И ПОЛУФАБРИКАТ.Ном1 < ПОЛУФАБРИКАТ1.Ном2
ГДЕ
	ПОЛУФАБРИКАТ1.Ном1 ЕСТЬ NULL
Показать
25. windsurf 52 19.11.19 09:41 Сейчас в теме
(22) не очень понял, что хотели сделать. Результат запроса вернул то же, что и у меня - повторы...
30. windsurf 52 19.11.19 10:06 Сейчас в теме
Всем спасибо за участие в поиске решения ;)
32. vugluscr1991 12 19.11.19 10:18 Сейчас в теме
Ошибся: И ПОЛУФАБРИКАТ.Ном1 < ПОЛУФАБРИКАТ1.Ном1

Ном1 Ном2
Вася Петя
Петя Вася

П1.Н1 П1.Н2 П2.Н1 П2.Н2
Вася Петя Петя Вася
Петя Вася Вася Петя

П1.Н1 = П2.Н2
И П1.Н2 = П2.Н1

И тогда условие

П1.Н1 < П2.Н1
отсечет последнюю строку.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот