Вы можете создать класс для своих параметров.
Вместо передачи нескольких параметров вы передаете один класс.
Ни один из самых высоких проголосовавших ответов не корректен на 2000 SQLServer. Возможно, они использовали различную версию.
Вот правильные версии их обоих на 2000 SQLServer.
select t.range as [score range], count(*) as [number of occurences]
from (
select case
when score between 0 and 9 then ' 0- 9'
when score between 10 and 19 then '10-19'
else '20-99' end as range
from scores) t
group by t.range
или
select t.range as [score range], count(*) as [number of occurences]
from (
select user_id,
case when score >= 0 and score< 10 then '0-9'
when score >= 10 and score< 20 then '10-19'
else '20-99' end as range
from scores) t
group by t.range
create table scores (
user_id int,
score int
)
select t.range as [score range], count(*) as [number of occurences]
from (
select user_id,
case when score >= 0 and score < 10 then '0-9'
case when score >= 10 and score < 20 then '10-19'
...
else '90-99' as range
from scores) t
group by t.range
declare @RangeWidth int
set @RangeWidth = 10
select
Floor(Score/@RangeWidth) as LowerBound,
Floor(Score/@RangeWidth)+@RangeWidth as UpperBound,
Count(*)
From
ScoreTable
group by
Floor(Score/@RangeWidth)
Возможно, Вы спрашиваете о хранении таких вещей, идущих...
, Конечно, Вы вызовете полное сканирование таблицы на предмет запросов и если таблица, содержащая очки, которым нужно соответствовать (агрегирования), является большой, Вы могли бы хотеть лучшее решение для выполнения, можно составить вторичную таблицу и использовать правила, такой как on insert
- Вы могли бы изучить ее.
Не все механизмы RDBMS имеют правила, хотя!
Ответ James Curran был самым кратким, по-моему, но вывод не был корректен. Для SQL Server самый простой оператор следующие:
SELECT
[score range] = CAST((Score/10)*10 AS VARCHAR) + ' - ' + CAST((Score/10)*10+9 AS VARCHAR),
[number of occurrences] = COUNT(*)
FROM #Scores
GROUP BY Score/10
ORDER BY Score/10
Это принимает #Scores временную таблицу, я раньше тестировал ее, я просто заполнил 100 строк со случайным числом между 0 и 99.
Я вижу ответы здесь, которые не будут работать в синтаксисе SQL Server. Я использовал бы:
select t.range as [score range], count(*) as [number of occurences]
from (
select case
when score between 0 and 9 then ' 0-9 '
when score between 10 and 19 then '10-19'
when score between 20 and 29 then '20-29'
...
else '90-99' end as range
from scores) t
group by t.range
РЕДАКТИРОВАНИЕ: см. комментарии
В пост-ГРЭС (где ||
оператор объединения строк):
select (score/10)*10 || '-' || (score/10)*10+9 as scorerange, count(*)
from scores
group by score/10
order by 1
дает:
scorerange | count
------------+-------
0-9 | 11
10-19 | 14
20-29 | 3
30-39 | 2
Альтернативный подход вовлек бы хранение диапазонов в таблицу, вместо того, чтобы встроить их в запрос. Вы закончили бы с таблицей, назвать его Диапазонами, который похож на это:
LowerLimit UpperLimit Range
0 9 '0-9'
10 19 '10-19'
20 29 '20-29'
30 39 '30-39'
И запрос, который похож на это:
Select
Range as [Score Range],
Count(*) as [Number of Occurences]
from
Ranges r inner join Scores s on s.Score between r.LowerLimit and r.UpperLimit
group by Range
Это действительно означает настраивать таблицу, но было бы легко поддержать, когда желаемые диапазоны изменяются. Никакие необходимые изменения кода!
select cast(score/10 as varchar) + '-' + cast(score/10+9 as varchar),
count(*)
from scores
group by score/10