Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
|
Сообщ.
#1
,
|
|
|
Есть возможность в СКД группировать по диапазонам? Есть колонка с числа, требуют группировать на 3 группы - 0-1000, 1001-10000, 10001-20000. Пока придумал что можно делать вычисляемое поле и вычислять если число 0-1000 писать 1, 1001-10000 - 2, 10001-20000-3 и группировать по этому вычисляемому полю. Но хотят ещё и диапазоны задавать вручную на форме отчета. Как быть?
|
Сообщ.
#2
,
|
|||||||||||||
|
Цитата ^D^ima @ Но хотят ещё и диапазоны задавать вручную на форме отчета. Как быть? А как будут задавать данные диапазоны? Пользователи они такие - за ними глаз да глаз нужен. Необходимо чтобы диапазоны не пересекались и в то же время перекрывали все варианты, ну или же в случае если значение выходит за границы дозволенного, формировать отдельную группу - "Прочее". Как вариант можно перед компоновкой данных сформировать таблицу значений по диапазонам, с 3 колонками:
Далее эту ТЗ поместить в параметр запроса и в конце связать по значению. Допустим в запросе во временной таблице ИсходныеДанные у нас уже выбраны нужные данные, а во временной таблице ТЗ находятся наши диапазоны, то тогда получается как-то так: ВЫБРАТЬ ИсходныеДанные.Число КАК Число, ЕСТЬNULL(ТЗ.ИмяГруппировки, "Прочее") КАК ИмяГруппировки ИЗ ИсходныеДанные КАК ИсходныеДанные ЛЕВОЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ ПО ИсходныеДанные.Число >= ТЗ.ЛевоеЗначение И ИсходныеДанные.Число <= ТЗ.ПравоеЗначение УПОРЯДОЧИТЬ ПО Число Ну и как итог - группируйте по полю - ИмяГруппировки |
Сообщ.
#3
,
|
|
|
Для примера можно вот такой запрос в консольке выполнить:
ВЫБРАТЬ "0-1000" КАК ИмяГруппировки, 0 КАК ЛевоеЗначение, 1000 КАК ПравоеЗначение ПОМЕСТИТЬ ТЗ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "1001-10000", 1001, 10000 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "10001-20000", 10001, 20000 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 0 КАК Число ПОМЕСТИТЬ Числа_0_1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Старший.Число * 2 + Младший.Число КАК Число ПОМЕСТИТЬ Числа_0_3 ИЗ Числа_0_1 КАК Младший, Числа_0_1 КАК Старший ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Старший.Число * 4 + Младший.Число КАК Число ПОМЕСТИТЬ Числа_00_15 ИЗ Числа_0_3 КАК Младший, Числа_0_3 КАК Старший ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Старший.Число * 16 + Младший.Число КАК Число ПОМЕСТИТЬ Числа_000_255 ИЗ Числа_00_15 КАК Младший, Числа_00_15 КАК Старший ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Старший.Число * 256 + Младший.Число КАК Число ПОМЕСТИТЬ ИсходныеДанные ИЗ Числа_000_255 КАК Младший, Числа_000_255 КАК Старший ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ИсходныеДанные.Число КАК Число, ЕСТЬNULL(ТЗ.ИмяГруппировки, "Прочее") КАК ИмяГруппировки ИЗ ИсходныеДанные КАК ИсходныеДанные ЛЕВОЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ ПО ИсходныеДанные.Число >= ТЗ.ЛевоеЗначение И ИсходныеДанные.Число <= ТЗ.ПравоеЗначение УПОРЯДОЧИТЬ ПО Число |