복붙노트

[SQL] SQL에서 어떻게 범위에서 당신 "에 의해 그룹"할 수 있습니까?

SQL

SQL에서 어떻게 범위에서 당신 "에 의해 그룹"할 수 있습니까?

나는 숫자 열이있는 테이블이 있다고 가정 ( "점수"를 호출 할 수 있습니다).

나는 몇 번이나 점수 쇼 각 범위에 등장, 카운트의 테이블을 생성하고 싶습니다.

예를 들면 :

score range  | number of occurrences
-------------------------------------
   0-9       |        11
  10-19      |        14
  20-29      |         3
   ...       |       ...

본 실시 예 19에 0 내지 10의 범위 내의 점수 14 행 내지 9의 범위의 점수 11 행, 및 20-29 범위의 점수 3 개 행이 있었다.

이 최대를 설정하는 쉬운 방법이 있나요? 추천 메뉴가 무엇인가요?

해결법

  1. ==============================

    1.둘 다 최고의 답변은 아마도 그들이 다른 버전을 사용하고 SQLServer에 2000 년에 올바른 투표를하지 않습니다.

    둘 다 최고의 답변은 아마도 그들이 다른 버전을 사용하고 SQLServer에 2000 년에 올바른 투표를하지 않습니다.

    여기의 SQLServer 2000 둘의 올바른 버전입니다.

    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
    
  2. ==============================

    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
    

    이 테이블까지 평균 설정을 수행하지만, 범위 변경을 원하는 경우 유지 관리가 용이 ​​할 것이다. 아무 코드가 필요한 변경되지 않습니다!

  3. ==============================

    3.나는 그 SQL 서버 구문에서 작동하지 않습니다 여기에 답변을 참조하십시오. 내가 사용합니다 :

    나는 그 SQL 서버 구문에서 작동하지 않습니다 여기에 답변을 참조하십시오. 내가 사용합니다 :

    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
    

    편집 : 코멘트보기

  4. ==============================

    4.(||는 문자열 연결 연산자) 포스트 그레스에서 :

    (||는 문자열 연결 연산자) 포스트 그레스에서 :

    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
    
  5. ==============================

    5.제임스 쿠란의 대답은 내 의견에 가장 간결했지만, 출력은 정확하지 않았다. 다음과 같이 SQL Server의 간단한 문장은 다음과 같습니다

    제임스 쿠란의 대답은 내 의견에 가장 간결했지만, 출력은 정확하지 않았다. 다음과 같이 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 임시 테이블은, 그냥 0에서 99 사이의 임의의 숫자 100 개 행을 채워 가정합니다.

  6. ==============================

    6.

    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
    
  7. ==============================

    7.

    select cast(score/10 as varchar) + '-' + cast(score/10+9 as varchar), 
           count(*)
    from scores
    group by score/10
    
  8. ==============================

    8.이것은 당신이 범위를 지정하지하고, SQL 서버 불가지론해야합니다 수 있습니다. 수학 FTW!

    이것은 당신이 범위를 지정하지하고, SQL 서버 불가지론해야합니다 수 있습니다. 수학 FTW!

    SELECT CONCAT(range,'-',range+9), COUNT(range)
    FROM (
      SELECT 
        score - (score % 10) as range
      FROM scores
    )
    
  9. ==============================

    9.나는 모든 경우를 정의하지 않고 다르게 때문에 크기가 조절 될 것으로 이것을에 조금 할 것입니다 :

    나는 모든 경우를 정의하지 않고 다르게 때문에 크기가 조절 될 것으로 이것을에 조금 할 것입니다 :

    select t.range as [score range], count(*) as [number of occurences]
    from (
      select FLOOR(score/10) as range
      from scores) t
    group by t.range
    

    아니 테스트,하지만 당신은 아이디어를 얻을 ...

  10. ==============================

    10.

    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)
    
  11. ==============================

    11.

    select t.blah 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 blah
      from scores) t
    group by t.blah
    

    당신은 MySQL의에 있다면 당신은 '범위'이외의 단어를 사용하거나, 위의 예를 실행 오류가 발생합니다 있는지 확인하십시오.

  12. ==============================

    12.열 존재가 (범위)에 분류되어 있기 때문에 대신 숫자 정렬로 사용되는 정렬이 문자열, 문자열 / 단어입니다.

    열 존재가 (범위)에 분류되어 있기 때문에 대신 숫자 정렬로 사용되는 정렬이 문자열, 문자열 / 단어입니다.

    한 문자열이 숫자 길이 밖으로 패드에 0을 가지고 정렬은 여전히 ​​의미 론적으로 올바른합니다 :

    SELECT t.range AS ScoreRange,
           COUNT(*) AS NumberOfOccurrences
      FROM (SELECT CASE
                        WHEN score BETWEEN 0 AND 9 THEN '00-09'
                        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 ScoreRange,
           COUNT(*) AS NumberOfOccurrences
      FROM (SELECT CASE
                        WHEN score BETWEEN 0 AND 9 THEN '000-009'
                        WHEN score BETWEEN 10 AND 19 THEN '010-019'
                        WHEN score BETWEEN 20 AND 99 THEN '020-099'
                        ELSE '100-999'
                   END AS Range
              FROM Scores) t
     GROUP BY t.Range
    
  13. ==============================

    13.시험

    시험

    SELECT (str(range) + "-" + str(range + 9) ) AS [Score range], COUNT(score) AS [number of occurances]
    FROM (SELECT  score,  int(score / 10 ) * 10  AS range  FROM scoredata )  
    GROUP BY range;
    
  14. ==============================

    14.아마 당신은 것 같은 것들을 유지에 대한 요구하고 ...

    아마 당신은 것 같은 것들을 유지에 대한 요구하고 ...

    물론 당신은 쿼리 전체 테이블 스캔을 호출 할 수 있습니다 및 필요 (집계)를 집계 할 수있는 점수를 포함하는 테이블이 큰 경우 더 나은 수행하는 솔루션을 할 수 있습니다, 당신은 같은 보조 테이블과 사용 규칙을 만들 수 있습니다 삽입에 - 당신은 그것으로 보일 수 있습니다.

    모든 RDBMS 엔진은, 그러나 규칙이!

  15. from https://stackoverflow.com/questions/232387/in-sql-how-can-you-group-by-in-ranges by cc-by-sa and MIT license