powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в SQL сгруппировать значения с определенным шагом?
25 сообщений из 30, страница 1 из 2
Как в SQL сгруппировать значения с определенным шагом?
    #39877340
Marisolka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, есть таблица
Возраст Кол-во1810181520522103114346

1.Как в SQL сделать группировку по возрасту, например, с шагом 5?

Возраст Кол-во15-202520-251530-351435-406
2. Как сделать группировку по возрасту, например, различными шагами? Т.е. до 18 лет, с 18 до 25, с 25 до 45 и т.д.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877354
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marisolka,

Сделайте новую колонку в запросе с помощью Case и назовите её AgeGroup.
PS : должно по идее быть в любом курсе по SQL...
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877378
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarisolkaТ.е. до 18 лет, с 18 до 25, с 25 до 45 и т.д.

1. Round(Кол-во/5,0)
2. "и т.д." в данном конкретном случае не работает. Ряд логически не продолжается. А так - Case.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877379
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select cast(b.begin as varchar(3)) + isnull(' - '+cast(b.end as varchar(3)),' и старше') as [Возраст],
       count(*) as [Кол-во]
  From [Таблица] a
  Left join (values (0,18),(18,25),(25,45),(45,null)) b(begin,end) 
    on a.[Возраст] >= b.begin and (a.[Возраст] < b.End or b.End is null)
 Group by b.begin,b.end
 Order by b.begin,b.end
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877382
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То-же метод, но Case проще.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877383
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ вместо null я ставлю 999
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877410
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarisolkaКак сделать группировку по возрасту, например, различными шагами? Т.е. до 18 лет, с 18 до 25, с 25 до 45 и т.д.
Самое разумное - завести таблицу с диапазонами возрастов (идНабора-возрастОт-возрастДо), и использовать ее как источник данных для группировки. В ней можно хранить неограниченное количество наборов - и равномерных. и кастомных...
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877428
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marisolka,
Если возраст целочисленный, то начало периода будет Возраст / 5 * 5
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877487
prog882
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Marisolka,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare @step int = 5;

declare @a table (age int, qty int)
insert into @a (age, qty) values 
	(18,10)
,	(18,15)
,	(20,5)
,	(22,10)
,	(31,14)
,	(35,6);

;with 
	b as 
( 
	select min(age) - min(age) % @step as g_age, max(age) + max(age) % @step as m_age from @a 
	union all
	select g_age + @step, m_age from b where g_age + @step <= m_age
)
,	c as 
(
	select g_age as min_age, isnull(lead(g_age) over (order by g_age), g_age + @step) as max_age from b
)
select concat(c.min_age, '-',c.max_age - 1) as age, sum(a.qty) as qty
from c
left join @a as a on a.age between c.min_age and c.max_age - 1
group by c.min_age, c.max_age;
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877502
prog882
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покороче,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @step int = 5;

declare @a table (age int, qty int)
insert into @a (age, qty) values 
	(18,10)
,	(18,15)
,	(20,5)
,	(22,10)
,	(31,14)
,	(35,6);

;with 
	b as 
( 
	select min(age) - min(age) % @step as beg_age, min(age) - min(age) % @step + @step as end_age
	,	max(age) + max(age) % @step as max_age from @a 
	union all
	select beg_age + @step,  beg_age + @step  + @step,  max_age from b where beg_age + @step <= max_age
)
select concat(b.beg_age, '-',b.end_age - 1) as age, sum(a.qty) as qty
from b
left join @a as a on a.age between b.beg_age and b.end_age - 1
group by b.beg_age, b.end_age;
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877684
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение с таблицей групп возрастов наилучшее, т.к. является data-driven, а не code-driven. Оптимальным для реляционных баз является решение, при котором результат запроса зависит от данных, а не от кода.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39877951
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Marisolka,

посмотрите на этом форуме темы "гистограмма", там есть варианты решения вашей задачи.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878218
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовРешение с таблицей групп возрастов наилучшее, т.к. является data-driven, а не code-driven. Оптимальным для реляционных баз является решение, при котором результат запроса зависит от данных, а не от кода.
Оно конечно в теории верно, но на практике зачастую подобную задачу приходится решать в некой системе отчетности,
где заведение и хранение таблиц не предусмотрено, а к рабочей базе доступ только на чтение.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878227
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183,

в случае изменения диапазона возрастов, например, придется переписывать и публиковать код. Такой подход популярен, но это не pro.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878252
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в альтернативе надо создавать интерфейс ввода таблиц, их контроля права доступа к ним.
Зачастую оно того не стоит.
А современные пользователи откорректировать правильно составленный код вполне в состоянии.
И многие "конструкторы отчетов" это замечательно позволяют делать.
Хотя конечно способ с таблицей более "прогрессивен" и правилен.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878305
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183А в альтернативе надо создавать интерфейс ввода таблиц, их контроля права доступа к ним.Не обязательно, если коррекция справочника предполагается раз в несколько месяцев/лет.
Но разработчикам будет проще править такой справочник, чем искать место, где, например, "Если возраст целочисленный, то начало периода будет Возраст / 5 * 5", а потом, если возникнет потребность изменить диапазон, впендюривать туда сложную формулу в CASE, по инерции.
Притом, что очень плохо, таких мест будет несколько (разные отчёты, интерфейсы), и, конечно, никто не булдет понимать ,что из этого используется, а что нет, поэтому придётся править и те 90% запросов, которые не используются.
В общем, что бы не делать справочник, нужно очень веское обоснование.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878324
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно такого рода таблицы находятся в зоне ответственности группы эксплуатации. По если ПО пишется для мелкоофисной работы, то создается интерфейс. Существуют еще и аналитические системы, но там другой случай, т.к. активно используется парадигма функционального программирования.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878385
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Группа эксплуатации" - это одно, а рисовальщики отчетов - совсем другое.
И не всегда у них есть соответствующие права и полномочия.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878410
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg982183А в альтернативе надо создавать интерфейс ввода таблиц, их контроля права доступа к ним.Не обязательно, если коррекция справочника предполагается раз в несколько месяцев/лет.
Но разработчикам будет проще править такой справочник, чем искать место, где, например, "Если возраст целочисленный, то начало периода будет Возраст / * 5", а потом, если возникнет потребность изменить диапазон, впендюривать туда сложную формулу в CASE, по инерции.
Притом, что очень плохо, таких мест будет несколько (разные отчёты, интерфейсы), и, конечно, никто не булдет понимать ,что из этого используется, а что нет, поэтому придётся править и те 90% запросов, которые не используются.
В общем, что бы не делать справочник, нужно очень веское обоснование.

Вы же понимаете, что вот эту "5", так же можно вынести в соответствующий справочник при необходимости и рулить им?
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878445
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кодд со товарищи писал, что все данные должны находиться в таблицах. И вся теория, на основе которой написана математика сервера БД, строится вокруг этого. Поэтому любые отступления снижают производительность запросов.

Другое дело, что в народе популярно использовать "против лома нет приёма", т.е. наращивать аппаратную мощь. А поэтому можно халтурить или не знать основные принципы, ишак же везёт.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878452
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовПоэтому любые отступления снижают производительность запросов.

И вы можете это доказать сравнительными тестами варианта "Возраст / 5 * 5" и варианта "джойн на таблицу диапазонов"?
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878478
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marisolka2. Как сделать группировку по возрасту, например, различными шагами? Т.е. до 18 лет, с 18 до 25, с 25 до 45 и т.д.

Используйте OLAP кубы
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878491
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexalexeyvgВ общем, что бы не делать справочник, нужно очень веское обоснование.
Вы же понимаете, что вот эту "5", так же можно вынести в соответствующий справочник при необходимости и рулить им?Формулу в справочник, и потом динамически строить запросы?
Понимаю, но мне этот вариант кажется ещё ужаснее, я его не рассматривал всерьёз.
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878498
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgmsLexпропущено...

Вы же понимаете, что вот эту "5", так же можно вынести в соответствующий справочник при необходимости и рулить им?Формулу в справочник, и потом динамически строить запросы?
Понимаю, но мне этот вариант кажется ещё ужаснее, я его не рассматривал всерьёз.

Зачем формулу, просто "шаг" группировки
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878509
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexalexeyvgпропущено...
Формулу в справочник, и потом динамически строить запросы?
Понимаю, но мне этот вариант кажется ещё ужаснее, я его не рассматривал всерьёз.

Зачем формулу, просто "шаг" группировкиШаг не имеет смысла, по тем причинам, которые я описал в посте, на который вы ответили.

Я же писал не про "куда засунуть цифру 5", а про то, что плохо раскидывать по приложению множество одинаковых формул, для одного и того же расчёта, их будет трудно читать, потом программисты будут их неоптимально менять (иногда слишком усложняя), да ещё и во многих местах.
Намного проще сделать справочник групп возрастов.
Или хотя бы справочник в коде, как 21996207 - это придётся менять во многих местах, но хотя бы логика будет прозрачная, и в сравнении исходников тоже будет всё прозрачно - что было, и что стало.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в SQL сгруппировать значения с определенным шагом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]