powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в SQL сгруппировать значения с определенным шагом?
30 сообщений из 30, показаны все 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
Как в SQL сгруппировать значения с определенным шагом?
    #39878534
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgmsLexпропущено...


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

Я же писал не про "куда засунуть цифру 5", а про то, что плохо раскидывать по приложению множество одинаковых формул, для одного и того же расчёта, их будет трудно читать, потом программисты будут их неоптимально менять (иногда слишком усложняя), да ещё и во многих местах.
Намного проще сделать справочник групп возрастов.
Или хотя бы справочник в коде, как 21996207 - это придётся менять во многих местах, но хотя бы логика будет прозрачная, и в сравнении исходников тоже будет всё прозрачно - что было, и что стало.

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

Я же писал не про "куда засунуть цифру 5", а про то, что плохо раскидывать по приложению множество одинаковых формул, для одного и того же расчёта, их будет трудно читать, потом программисты будут их неоптимально менять (иногда слишком усложняя), да ещё и во многих местах.
Намного проще сделать справочник групп возрастов.
Или хотя бы справочник в коде, как 21996207 - это придётся менять во многих местах, но хотя бы логика будет прозрачная, и в сравнении исходников тоже будет всё прозрачно - что было, и что стало.
Странно, а формулу клочиство*цена тоже нельзя нигде писать в коде? Вместо неё нужно использовать джойн на таблицу предрасчитанных результатов бинарных операций?количество*цена можно. Но более сложные расчёты иногда стараются как то централизовать, что бы не размазывать по коду.

По моему, разница между умножением количества на цену, или справочниками, типа справочника НДС, справочника диапазонов для прогрессивного налогообложения, справочников возрастов, вроде очевидна.

Неужели вы серьёзно считаете, что справочники не нужны, а лучше закодить это "Возраст / 5 * 5" прямо в десятке запросов, не забывая приводить к int (а так же придумывая похожие формулы для разных диапазонов)?
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39878542
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТС задал два вопроса:

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

2. Как сделать группировку по возрасту, например, различными шагами ? Т.е. до 18 лет, с 18 до 25, с 25 до 45 и т.д.

Во втором случае записать формулу проблематично. Но почему-то так долго обсуждается формула и ее место в запросе.


Потом окажется, что результат нужно представить "горизонтально".

Это было рассмотрено в 16671431 , как ответ одному уважаемому мной человеку на беседу в 16535446 .
...
Рейтинг: 0 / 0
Как в SQL сгруппировать значения с определенным шагом?
    #39879243
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

очевидно, что функция показывает правильный результат, как и запрос с таблицей. Но работают они используя разные принципы. Разработчик БД, использующий в первую очередь приемы функционального и процедурного программирования против возможности организации данных в таблицах и использования запросов должен понимать последствия решений.

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

очевидно, что функция показывает правильный результат, как и запрос с таблицей. Но работают они используя разные принципы. Разработчик БД, использующий в первую очередь приемы функционального и процедурного программирования против возможности организации данных в таблицах и использования запросов должен понимать последствия решений.

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

Вы путаетесь в показаниях, сначала писали про производительность, теперь про поддержку кода.
Давайте разбираться по пунктам.

Так что там с производительностью?
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в SQL сгруппировать значения с определенным шагом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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