[SQL] SQL에서 어떻게 범위에서 당신 "에 의해 그룹"할 수 있습니까?
SQLSQL에서 어떻게 범위에서 당신 "에 의해 그룹"할 수 있습니까?
나는 숫자 열이있는 테이블이 있다고 가정 ( "점수"를 호출 할 수 있습니다).
나는 몇 번이나 점수 쇼 각 범위에 등장, 카운트의 테이블을 생성하고 싶습니다.
예를 들면 :
score range | number of occurrences ------------------------------------- 0-9 | 11 10-19 | 14 20-29 | 3 ... | ...
본 실시 예 19에 0 내지 10의 범위 내의 점수 14 행 내지 9의 범위의 점수 11 행, 및 20-29 범위의 점수 3 개 행이 있었다.
이 최대를 설정하는 쉬운 방법이 있나요? 추천 메뉴가 무엇인가요?
해결법
-
==============================
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.다른 방법 대신 쿼리를 삽입의 테이블에서 범위를 저장 포함한다. 이 같은 그 모습, 그 범위 전화, 테이블로 끝날 것입니다 :
다른 방법 대신 쿼리를 삽입의 테이블에서 범위를 저장 포함한다. 이 같은 그 모습, 그 범위 전화, 테이블로 끝날 것입니다 :
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.나는 그 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.(||는 문자열 연결 연산자) 포스트 그레스에서 :
(||는 문자열 연결 연산자) 포스트 그레스에서 :
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.제임스 쿠란의 대답은 내 의견에 가장 간결했지만, 출력은 정확하지 않았다. 다음과 같이 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.
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.
select cast(score/10 as varchar) + '-' + cast(score/10+9 as varchar), count(*) from scores group by score/10
-
==============================
8.이것은 당신이 범위를 지정하지하고, SQL 서버 불가지론해야합니다 수 있습니다. 수학 FTW!
이것은 당신이 범위를 지정하지하고, SQL 서버 불가지론해야합니다 수 있습니다. 수학 FTW!
SELECT CONCAT(range,'-',range+9), COUNT(range) FROM ( SELECT score - (score % 10) as range FROM scores )
-
==============================
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.
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.
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.열 존재가 (범위)에 분류되어 있기 때문에 대신 숫자 정렬로 사용되는 정렬이 문자열, 문자열 / 단어입니다.
열 존재가 (범위)에 분류되어 있기 때문에 대신 숫자 정렬로 사용되는 정렬이 문자열, 문자열 / 단어입니다.
한 문자열이 숫자 길이 밖으로 패드에 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.시험
시험
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.아마 당신은 것 같은 것들을 유지에 대한 요구하고 ...
아마 당신은 것 같은 것들을 유지에 대한 요구하고 ...
물론 당신은 쿼리 전체 테이블 스캔을 호출 할 수 있습니다 및 필요 (집계)를 집계 할 수있는 점수를 포함하는 테이블이 큰 경우 더 나은 수행하는 솔루션을 할 수 있습니다, 당신은 같은 보조 테이블과 사용 규칙을 만들 수 있습니다 삽입에 - 당신은 그것으로 보일 수 있습니다.
모든 RDBMS 엔진은, 그러나 규칙이!
from https://stackoverflow.com/questions/232387/in-sql-how-can-you-group-by-in-ranges by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 오라클에서 상위 1을해야합니까? (0) | 2020.03.16 |
---|---|
[SQL] 어떻게 MySQL의에서 다음 / 이전 기록을 얻으려면? (0) | 2020.03.16 |
[SQL] 어떻게 SQL 쿼리를 사용하여 쉼표로 구분 된 목록을 만들려면 어떻게해야합니까? (0) | 2020.03.16 |
[SQL] 두 개의 서로 다른 데이터베이스에 테이블을 사이에 가입? (0) | 2020.03.16 |
[SQL] MySQL은 시뮬레이션 지연 기능 (0) | 2020.03.16 |