Хитрый отбор в СКД

1. Confucius 81 27.06.21 15:29 Сейчас в теме
Всем привет! Небольшая проблема возникла при разработке отчета на СКД.
Вообщем есть некая воронка продаж. Есть справочник этапов их 5. Теоретически клиент передвигается по этапам воронок от 1 к 5. Каждое передвижение создает запись в регистре истории передвижений (Клиент, этап).
Отчет показывает по клиенту историю передвижения по этапам. Вроде все просто.
Но клиент может пройти 1,2,3 и потом сразу на 5 этап. Те 4 пропустил.
Нужно в отчете сделать отбор тех клиентов кто не был на 4 например этапе. Но на самом деле он мог не быть на других этапах (2,3,4 мог пропустить)
И вот не могу придумать как показать если записи нет в регистре.
Прошу совета.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 27.06.21 16:26 Сейчас в теме
(1) для конкретной задачи пропуска 4 этапа достаточно просто. Отобрать клиентов у которых есть 5 этап и нет 4 этапа. Более подробно сложно советовать не видя всей структуры конфигурации по данному вопросу.
3. kasper076 105 27.06.21 16:41 Сейчас в теме
Таблицу истории передвижений соединить внутренним соединением с таблицей содержащей все 5 этапов, по этапу. Получим клиентов прошедших все этапы. Затем эту таблицу истории передвижений соединить с таблицей содержащей все этапы, кроме 4-го и исключить клиентов полученных в первом запросе. И так перебрать все все возможные варианты исключая из них ранее полученных клиентов.
4. Kolesonik 13 27.06.21 17:57 Сейчас в теме
При кампоновке результата программный отбор, собираем все этапы, исключаем который указал пользователь, отбор новая группа И
отбор новый элемент правое значение равно в списке отобранных и не равно новый элемент отбора элемент пользователя, помоему должно получится
5. kasper076 105 27.06.21 18:40 Сейчас в теме
ВЫБРАТЬ
	1 КАК Позиция, 1 КАК ЧленРяда
ПОМЕСТИТЬ СтепеннойРяд
ОБЪЕДИНИТЬ
ВЫБРАТЬ	2,31
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПОДСТРОКА("0123456789", СтепеннойРяд.Позиция, 1) КАК Символ,
	СтепеннойРяд.Позиция КАК Код
ПОМЕСТИТЬ КодоваяТаблица
ИЗ
	СтепеннойРяд КАК СтепеннойРяд
ИНДЕКСИРОВАТЬ ПО
	Символ
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ	"Клиент1" КАК Ссылка, "01" КАК КодЭтапа
ПОМЕСТИТЬ ИсходныеДанные
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент1", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент3", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент3", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент3", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент4", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент4", "05"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсходныеДанные.Ссылка КАК Ссылка,
	ПОДСТРОКА(ИсходныеДанные.КодЭтапа, СтепеннойРяд.Позиция, 1) КАК СимволКода,
	СтепеннойРяд.ЧленРяда КАК ЧленРяда
ПОМЕСТИТЬ ОтдельныеСимволы
ИЗ
	ИсходныеДанные КАК ИсходныеДанные,
	СтепеннойРяд КАК СтепеннойРяд
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ОтдельныеСимволы.Ссылка КАК Ссылка,
	СУММА(ОтдельныеСимволы.ЧленРяда * КодоваяТаблица.Код) КАК Хэш
ПОМЕСТИТЬ ВыходныеДанные
ИЗ
	ОтдельныеСимволы КАК ОтдельныеСимволы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ КодоваяТаблица КАК КодоваяТаблица
		ПО ОтдельныеСимволы.СимволКода = КодоваяТаблица.Символ
СГРУППИРОВАТЬ ПО
	ОтдельныеСимволы.Ссылка
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыходныеДанные.Ссылка КАК Ссылка
ИЗ
	ВыходныеДанные КАК ВыходныеДанные
ИТОГИ ПО
	Хэш
Показать

Запрос группирует клиентов имеющих одинаковые наборы этапов. Статья Расчет хэш-функции в запросе.
Все что остается это отбирать по значениям хэша.
Confucius; +1 Ответить
6. Confucius 81 27.06.21 19:20 Сейчас в теме
Спасибо всем кто откликнулся. Теперь понятно куда двигаться и какие варианты. Буду пилить.
7. karamazoff 96 27.06.21 19:59 Сейчас в теме
сейчас проверить не могу, но на вскидку - берем справочник этапы, через левое соединение соединяем его с истории передвижений по полю этап, берем клиента из правой таблицы, этап из левой и добавляем 3-е поле где выбор если клиент есть нулл тогда "пропуск" иначе "ок".
В результате получаем таблицу из 3 колонок, где на каждого клиента по 5 этапов и напротив каждого есть метка, дальше в компановке дело техники
Confucius; +1 Ответить
8. kasper076 105 28.06.21 12:27 Сейчас в теме
(7)
ВЫБРАТЬ	"01" КАК КодЭтапа
ПОМЕСТИТЬ Этапы
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"05"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ	"Клиент1" КАК Клиент, "01" КАК КодЭтапа
ПОМЕСТИТЬ История
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент1", "04"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент1", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "02"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "04"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент4", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент4", "05"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	История.Клиент КАК Клиент,
	Этапы.КодЭтапа КАК КодЭтапа,
	ВЫБОР КОГДА История.Клиент ЕСТЬ NULL ТОГДА "-" ИНАЧЕ "+" КОНЕЦ КАК Поле1
ИЗ Этапы КАК Этапы	ЛЕВОЕ СОЕДИНЕНИЕ История КАК История ПО (Этапы.КодЭтапа = История.КодЭтапа)
Показать


Не будет по 5 этапов на каждого клиента.
Прикрепленные файлы:
9. Confucius 81 28.06.21 16:59 Сейчас в теме
(8)
ВЫБРАТЬ "01" КАК КодЭтапа
ПОМЕСТИТЬ Этапы
ОБЪЕДИНИТЬ
ВЫБРАТЬ "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "05"
;
////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ "Клиент1" КАК Клиент, "01" КАК КодЭтапа
ПОМЕСТИТЬ История
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент1", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент1", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент1", "04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент1", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент2", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент3", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент3", "03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент3", "05"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент4", "01"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Клиент4", "05"
;
////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
История.Клиент КАК Клиент,
Этапы.КодЭтапа КАК КодЭтапа,
ВЫБОР КОГДА История.Клиент ЕСТЬ NULL ТОГДА "-" ИНАЧЕ "+" КОНЕЦ КАК Поле1
ИЗ Этапы КАК Этапы ЛЕВОЕ СОЕДИНЕНИЕ История КАК История ПО (Этапы.КодЭтапа = История.КодЭтапа)
Показать

А как тогда правильнее сделать? Я в той статье вообще ничего понял)) Очень интересно, но нифига не понял как применить.
10. kasper076 105 29.06.21 01:05 Сейчас в теме
(9) я же в (5) привел готовый запрос. Нужно ток таблицы Этапы и История заменить на реальные.
Confucius; +1 Ответить
11. kasper076 105 29.06.21 23:04 Сейчас в теме
(9) Еще может вот такой вариант проканать
ВЫБРАТЬ	"01" КАК КодЭтапа
ПОМЕСТИТЬ Этапы
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"03"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"04"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"05"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ	"Клиент1" КАК Клиент, "01" КАК КодЭтапа
ПОМЕСТИТЬ История
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "02"
ОБЪЕДИНИТЬ
ВЫБРАТЬ	"Клиент1", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент1", "04"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент1", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "02"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "04"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент2", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "03"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент3", "05"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент4", "01"
ОБЪЕДИНИТЬ         
ВЫБРАТЬ	"Клиент4", "05"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ	История.Клиент КАК Клиент, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) КАК КодЭтапа
ПОМЕСТИТЬ Этапы12345
ИЗ	Этапы КАК Этапы	ВНУТРЕННЕЕ СОЕДИНЕНИЕ История КАК История ПО (Этапы.КодЭтапа = История.КодЭтапа)
СГРУППИРОВАТЬ ПО История.Клиент
ИМЕЮЩИЕ	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) = 5
;
ВЫБРАТЬ	История.Клиент,	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) КАК КодЭтапа
ПОМЕСТИТЬ Этапы135	
ИЗ	Этапы КАК Этапы	ВНУТРЕННЕЕ СОЕДИНЕНИЕ История КАК История ПО (Этапы.КодЭтапа = История.КодЭтапа)
			И (Этапы.КодЭтапа В ("01", "03", "05")) и не История.Клиент в (Выбрать Этапы12345.Клиент Из Этапы12345)
СГРУППИРОВАТЬ ПО История.Клиент
ИМЕЮЩИЕ	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) = 3
;
ВЫБРАТЬ	История.Клиент,	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) КАК КодЭтапа
ПОМЕСТИТЬ Этапы15
ИЗ	Этапы КАК Этапы	ВНУТРЕННЕЕ СОЕДИНЕНИЕ История КАК История
		ПО (Этапы.КодЭтапа = История.КодЭтапа) И (Этапы.КодЭтапа В ("01", "05")) И НЕ История.Клиент в (Выбрать Этапы135.Клиент Из Этапы135) И НЕ История.Клиент В (Выбрать Этапы12345.Клиент Из Этапы12345)
СГРУППИРОВАТЬ ПО История.Клиент
ИМЕЮЩИЕ	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ История.КодЭтапа) = 2
Показать

Но нужно прописать все комбинации и продумать порядок для правильного исключения предыдущих.
Оставьте свое сообщение

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