Разбиение числа по диапазонам

1. ViktorG 11.11.24 11:30 Сейчас в теме
Имеется некое число, имеется таблица диапазонов. Соответственно нужно разбить это число согласно этих диапазонов, т.е. есть диапазоны: 0-200,200-300, свыше300, число 500 должно разбиться следующим образом: в первую группу 200, во-вторую 100, остатки 200 в третью. Таблица с диапазонами меняется в зависимости от настроения(. Раньше требовалось собирать данные без такой разбивки, а только по самому числу, входит оно в диапазон или нет, все добавлялось в запрос в цикле, а с такой разбивкой не соображу как это сделать. И как все это в макет вывести, т.к. количество колонок зависит от количества диапазонов
Прикрепленные файлы:
Книга1.xlsx
По теме из базы знаний
Найденные решения
24. Oldsad 21.11.24 08:42 Сейчас в теме
(23) вот что имею ввиду:
ВЫБРАТЬ
	0 КАК Начало,
	200 КАК Окончание
ПОМЕСТИТЬ ВТ_Диапазоны

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	200,
	300

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	300,
	NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	500 КАК Число
ПОМЕСТИТЬ ВТ_Числа

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	700

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	235

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	75
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА 0 < Диапазоны.Начало
			ТОГДА Диапазоны.Начало
		ИНАЧЕ 0
	КОНЕЦ КАК Начало,
	ВЫБОР
		КОГДА Диапазоны.Окончание < Числа.Число
			ТОГДА Диапазоны.Окончание
		ИНАЧЕ Числа.Число
	КОНЕЦ КАК Окончание
ИЗ
	ВТ_Числа КАК Числа
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Диапазоны КАК Диапазоны
		ПО ((Диапазоны.Окончание Есть Null ИЛИ 0 < Диапазоны.Окончание)
				И Числа.Число > Диапазоны.Начало)
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Vlan 36 11.11.24 12:01 Сейчас в теме
(1) На первый взгляд, все просто: начинаем "с конца". Число больше 300? Отнимаем остаток и запихиваем в третью. Остальное распределяем 200+100. Если меньше, сравниваем с 200 по тому же сценарию.
7. ViktorG 19.11.24 14:57 Сейчас в теме
(2) А в запрос как-то этот цикл запихать можно?
8. Vlan 36 19.11.24 15:03 Сейчас в теме
(7) Если самих диапазонов постоянное количество, а меняется только количество чисел в них, то вполне.
9. ViktorG 19.11.24 19:17 Сейчас в теме
(8) В том то и дело, что может меняться как количество диапазонов, так и их размерность
10. Vlan 36 20.11.24 07:28 Сейчас в теме
(9) Не любят запросы такую неопределенность. Я бы попробовал сделать так:
1. Во временную таблицу загружаем диапазоны (колонки (Н)ачало и (К)онец).
2. Добавил бы этой таблице колонку (П)оследняя. Соответственно, нужно определить максимальный диапазон для числа. Если (Ч)исло больше Н, то ставим ЛОЖЬ, если меньше Н, ставим НЕОПРЕДЕЛЕНО. Среди строк с П ЛОЖЬ находим максимальный К. Это и будет последняя, ставим ИСТИНА.
3. Далее к этой таблице присоединяем число по следующему алгоритму для П:
Если НЕОПРЕДЕЛЕНО, пропускаем - 0.
Если ИСТИНА, из Ч отнимаем Н - это остаток.
Если ЛОЖЬ, от К отнимаем Н - все числа диапазона входят в Ч.

Вроде так. Это теоретически, по-быстрому. Надо на практике смотреть, что в итоге получится для разных вариантов.
3. user-z99999 71 11.11.24 12:04 Сейчас в теме
(1) Чтобы отчет каждый раз не править,
создай регистр сведений и укажи там диапазоны и название.
И цепляй его в СКД.
25. Vlan 36 21.11.24 10:20 Сейчас в теме
(1) По моему сценарию вот так можно сделать:

ВЫБРАТЬ
	Диапазоны.Нач КАК Нач,
	ВЫБОР
		КОГДА Диапазоны.Кон = 0
				ИЛИ Диапазоны.Кон ЕСТЬ NULL
			ТОГДА &мЧисло + Диапазоны.Нач
		ИНАЧЕ Диапазоны.Кон
	КОНЕЦ КАК Кон,
	ВЫБОР
		КОГДА &мЧисло <= Диапазоны.Нач
			ТОГДА НЕОПРЕДЕЛЕНО
		КОГДА &мЧисло > Диапазоны.Нач
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК Последняя
ПОМЕСТИТЬ ВТ_Диапазоны
ИЗ
	&Диапазоны КАК Диапазоны
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(Диапазоны.Кон) КАК Кон
ПОМЕСТИТЬ ВТ_ДиапазоныМаксимум
ИЗ
	ВТ_Диапазоны КАК Диапазоны
ГДЕ
	Диапазоны.Последняя = ЛОЖЬ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Диапазоны.Нач КАК Нач,
	ВТ_Диапазоны.Кон КАК Кон,
	ВЫБОР
		КОГДА ВТ_Диапазоны.Кон = ВТ_ДиапазоныМаксимум.Кон
			ТОГДА ИСТИНА
		ИНАЧЕ ВТ_Диапазоны.Последняя
	КОНЕЦ КАК Последняя
ПОМЕСТИТЬ ВТ_ДиапазоныРаспр
ИЗ
	ВТ_Диапазоны КАК ВТ_Диапазоны
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДиапазоныМаксимум КАК ВТ_ДиапазоныМаксимум
		ПО (ИСТИНА)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ДиапазоныРаспр.Нач КАК Нач,
	ВТ_ДиапазоныРаспр.Кон КАК Кон,
	ВТ_ДиапазоныРаспр.Последняя КАК Последняя,
	ВЫБОР
		КОГДА ВТ_ДиапазоныРаспр.Последняя = НЕОПРЕДЕЛЕНО
			ТОГДА 0
		КОГДА ВТ_ДиапазоныРаспр.Последняя = ИСТИНА
			ТОГДА &мЧисло - ВТ_ДиапазоныРаспр.Нач
		ИНАЧЕ ВТ_ДиапазоныРаспр.Кон - ВТ_ДиапазоныРаспр.Нач
	КОНЕЦ КАК Разбивка
ИЗ
	ВТ_ДиапазоныРаспр КАК ВТ_ДиапазоныРаспр
Показать
4. user2107191 11.11.24 12:04 Сейчас в теме
Обычная постобработка с распределением. И быстро и понятно.
Хотя можно и запросом.
5. ViktorG 11.11.24 13:29 Сейчас в теме
(4) А макет как формировать? количество строк в диапазоне может быть любым, соответственно и количество колонок
6. user2107191 11.11.24 13:34 Сейчас в теме
(5) Я где-то написал слово "макет"? Или где-то в твоем первоначальном посте есть слово "макет"?
Или ты не со мной разговариваешь? Если не со мной - то научись для начала тыкать в кнопочку "Ответить" именно под тем комментарием, на который отвечаешь.
11. PowerBoy 3417 20.11.24 09:33 Сейчас в теме
Добавляешь справочник диапазонов. Где лежит число, добавляешь реквизит "диапазон", который заполняется когда меняется число. Все, выборка запросом просто по диапазону.
12. user2107191 20.11.24 09:43 Сейчас в теме
(11) Помедленнее, я записываю...

Для непонятливых. Число надо разбить на несколько диапазонов. А не присвоить ему единственный диапазон.
13. starik-2005 3089 20.11.24 10:19 Сейчас в теме
Сдается мне, что это типа нарастающего итога, только нарастающий итог вычитается из числа. Решается стандартной "треугольной" выборкой, когда из значения вычитается сумма диапазонов строки это "треугольной" таблицы.

Т.е. что-то типа
sel ect
where t.a - sum(d.b) > 0 then t.a - sum(d.b) else 0 end as field0
fr om t, d
where t.a > d.b


Где а - это исходная таблица с числом, которое нужно раздербанить по диапазонам, ну а вторая таблица - это диапазоны.

В общем тут все условно и нужно смотреть на данные.

Дисклеймер: цель сообщения не дать ответ, а навести на мысль.
14. user2107191 20.11.24 10:50 Сейчас в теме
(13)
цель сообщения не дать ответ, а навести на мысль.
Только балаболить и умеете! Если нет ответа по существу вопроса - не заходите в тему, пройдите мимо!!!
starik-2005; +1 Ответить
15. user1863362 20.11.24 10:58 Сейчас в теме
(13)
Решается стандартной "треугольной" выборкой
У человека проблема, а вы сюда самоутверждаться приходите!
starik-2005; +1 Ответить
16. starik-2005 3089 20.11.24 14:06 Сейчас в теме
17. ViktorG 20.11.24 14:28 Сейчас в теме
(13) А без sql это как будет? А подобие данных в прилагаемом файле, где диапазоны табличная часть на форме отчета, а таблица чисел из регистра накопления достается
18. user2107191 20.11.24 14:35 Сейчас в теме
(17) Обычное распределение в цикле по диапазонам. На каждой итерации соответствующий диапазон откусывает свою допустимую долю. Главное - отсортировать диапазоны по мере приоритета использования.
19. Anton_new01 20.11.24 15:09 Сейчас в теме
(1) вот сделал в экселе лови.
Прикрепленные файлы:
Книга2.xlsx
20. Dr.HiHi 2 21.11.24 02:42 Сейчас в теме
почему в примере 500 разбиваеться на 200, 100, 200, а не на 200, 300??

а по существу, то можно что-то придумать на подобии распределения реализуемого товара между партиями в запросе
диапазон - это партия
таблица с числами - это товар

или что-то типа как в (13) как высчитываються итоги в запросе, когда береться таблица начальный остаток и таблица оборотов и для каждой строки оборота высчитываються данные... в этом случаи нужно диапазон представить как обороты расход, а таблица с числами как начальный остаток
22. ViktorG 21.11.24 07:50 Сейчас в теме
(20) Оно может и пять раз по 100 разбиться, а может как на рисунке. Там свернуто до месяца
Прикрепленные файлы:
21. Oldsad 21.11.24 06:48 Сейчас в теме
Под задачей "разбить число согласно диапазонов" видимо подразумевается следующее:
Задана таблица диапазонов, есть таблица чисел предположительно задающие диапазоны от 0 до "число". Нужно найти пересечение диапазонов этих двух таблиц.

Решается банальным соединением двух таблиц, с проверкой на пересечение диапазонов, где диапазоны будут соответственно с наибольшей из нижних границ и с наименьшей из верхних.
23. ViktorG 21.11.24 08:06 Сейчас в теме
(21) По этому пересечению считается количество вхождений в эти диапазоны, а нужно именно разбить (разделить) число на составные части
24. Oldsad 21.11.24 08:42 Сейчас в теме
(23) вот что имею ввиду:
ВЫБРАТЬ
	0 КАК Начало,
	200 КАК Окончание
ПОМЕСТИТЬ ВТ_Диапазоны

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	200,
	300

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	300,
	NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	500 КАК Число
ПОМЕСТИТЬ ВТ_Числа

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	700

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	235

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	75
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА 0 < Диапазоны.Начало
			ТОГДА Диапазоны.Начало
		ИНАЧЕ 0
	КОНЕЦ КАК Начало,
	ВЫБОР
		КОГДА Диапазоны.Окончание < Числа.Число
			ТОГДА Диапазоны.Окончание
		ИНАЧЕ Числа.Число
	КОНЕЦ КАК Окончание
ИЗ
	ВТ_Числа КАК Числа
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Диапазоны КАК Диапазоны
		ПО ((Диапазоны.Окончание Есть Null ИЛИ 0 < Диапазоны.Окончание)
				И Числа.Число > Диапазоны.Начало)
Показать
26. ViktorG 21.11.24 11:33 Сейчас в теме
(24)
ВЫБОР
		КОГДА Диапазоны.Окончание <= Числа.Число
			ТОГДА Диапазоны.Окончание - Диапазоны.Начало
		ИНАЧЕ Числа.Число - Диапазоны.Начало
	КОНЕЦ КАК Окончание

Вот с такой доработкой подойдет
27. ViktorG 21.11.24 11:42 Сейчас в теме
Спасибо всем за участие и помощь
Оставьте свое сообщение

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