В SQL, как может Вы “группа” в диапазонах?

Вы можете создать класс для своих параметров.

Вместо передачи нескольких параметров вы передаете один класс.

169
задан Mitch Wheat 9 November 2008 в 05:38
поделиться

9 ответов

Ни один из самых высоких проголосовавших ответов не корректен на 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
133
ответ дан Ron Tuffin 4 November 2019 в 16:35
поделиться
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
5
ответ дан tvanfosson 4 November 2019 в 16:35
поделиться
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)
2
ответ дан Aheho 4 November 2019 в 16:35
поделиться

Возможно, Вы спрашиваете о хранении таких вещей, идущих...

, Конечно, Вы вызовете полное сканирование таблицы на предмет запросов и если таблица, содержащая очки, которым нужно соответствовать (агрегирования), является большой, Вы могли бы хотеть лучшее решение для выполнения, можно составить вторичную таблицу и использовать правила, такой как on insert - Вы могли бы изучить ее.

Не все механизмы RDBMS имеют правила, хотя!

-1
ответ дан Richard T 4 November 2019 в 16:35
поделиться

Ответ 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.

10
ответ дан Timothy Walters 4 November 2019 в 16:35
поделиться

Я вижу ответы здесь, которые не будут работать в синтаксисе 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

РЕДАКТИРОВАНИЕ: см. комментарии

30
ответ дан Ken Paul 4 November 2019 в 16:35
поделиться

В пост-ГРЭС (где || оператор объединения строк):

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
21
ответ дан mhawke 4 November 2019 в 16:35
поделиться

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

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

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

32
ответ дан Walter Mitty 4 November 2019 в 16:35
поделиться
select cast(score/10 as varchar) + '-' + cast(score/10+9 as varchar), 
       count(*)
from scores
group by score/10
5
ответ дан James Curran 4 November 2019 в 16:35
поделиться