문제

다음과 같은 데이터베이스 열 '등급'이 있다고 가정 해 봅시다.

|grade|
|    1|
|    2|
|    1|
|    3|
|    4|
|    5|

SQL에는 이와 같은 히스토그램을 생성하는 사소한 방법이 있습니까?

|2,1,1,1,1,0|

여기서 2는 1 등급이 두 번 발생한다는 것을 의미합니다. 1s 평균 등급 {2..5}는 한 번, 0은 6 학년이 전혀 발생하지 않는다는 것을 의미합니다.

히스토그램이 카운트 당 한 행인지 신경 쓰지 않습니다.

그렇지 않으면 데이터베이스는 UnixODBC/freetds를 통해 Perl CGI에 의해 액세스되는 SQL Server입니다.

편집하다: 빠른 답변에 감사드립니다! 존재하지 않는 값 (위의 예에서 6 학년 등)이 어떤 히스토그램 값에 속한지를 알 수있는 한 발생하지 않으면 괜찮습니다.

도움이 되었습니까?

해결책

SELECT COUNT(grade) FROM table GROUP BY grade ORDER BY grade

검증하지는 않았지만 작동해야합니다. 그러나 테이블에는 전혀 존재하지 않기 때문에 6 학년에 수를 표시하지 않습니다 ...

다른 팁

임시 테이블을 사용하여 결 측값을 얻으십시오.

CREATE TABLE #tmp(num int)
DECLARE @num int
SET @num = 0
WHILE @num < 10
BEGIN
  INSERT #tmp @num
  SET @num = @num + 1
END


SELECT t.num as [Grade], count(g.Grade) FROM gradeTable g
RIGHT JOIN #tmp t on g.Grade = t.num
GROUP by t.num
ORDER BY 1

데이터 포인트가 많으면 그룹 범위가 함께합니다 이와 같이:

SELECT FLOOR(grade/5.00)*5 As Grade, 
       COUNT(*) AS [Grade Count]
FROM TableName
GROUP BY FLOOR(Grade/5.00)*5
ORDER BY 1

또한 전체 범위에 라벨을 붙이려면 CTE로 바닥과 천장을 미리 얻을 수 있습니다.

With GradeRanges As (
  SELECT FLOOR(Score/5.00)*5     As GradeFloor, 
         FLOOR(Score/5.00)*5 + 4 As GradeCeiling
  FROM TableName
)
SELECT GradeFloor,
       CONCAT(GradeFloor, ' to ', GradeCeiling) AS GradeRange,
       COUNT(*) AS [Grade Count]
FROM GradeRanges
GROUP BY GradeFloor, CONCAT(GradeFloor, ' to ', GradeCeiling)
ORDER BY GradeFloor

메모: 일부 SQL 엔진에서는 가능합니다 GROUP BY 서수 열 색인이지만 MS SQL과 함께 원한다면 SELECT 진술, 당신은 그것에 의해 그룹화되어야하므로 범위를 그룹 표현식으로 복사해야합니다.

옵션 2: 당신은 사용할 수 있습니다 값을 선택적으로 임의의 빈으로 계산 한 다음 비트를 해제하는 사례 명세서 포함 된 값의 행으로 행으로 행을 얻으려면

Gamecat의 Distine의 사용은 나에게 조금 이상해 보입니다. 사무실로 돌아 왔을 때 시도해야 할 것입니다 ...

내가 할 방법은 비슷합니다 ...

SELECT
    [table].grade        AS [grade],
    COUNT(*)             AS [occurances]
FROM
    [table]
GROUP BY
    [table].grade
ORDER BY
    [table].grade

0이 발생하는 데이터 부족을 극복하려면 모든 유효한 등급이 포함 된 테이블에 가입 할 수 있습니다. 카운트 (*)는 널을 계산하지만 카운트 (등급)는 널을 계산하지 않습니다.

DECLARE @grades TABLE (
   val INT
   )  

INSERT INTO @grades VALUES (1)  
INSERT INTO @grades VALUES (2)  
INSERT INTO @grades VALUES (3)  
INSERT INTO @grades VALUES (4)  
INSERT INTO @grades VALUES (5)  
INSERT INTO @grades VALUES (6)  

SELECT
    [grades].val         AS [grade],
    COUNT([table].grade) AS [occurances]
FROM
    @grades   AS [grades]
LEFT JOIN
    [table]
        ON [table].grade = [grades].val
GROUP BY
    [grades].val
ORDER BY
    [grades].val
select Grade, count(Grade)
from MyTable
group by Grade

Shlomo Priymak의 기사에 따르면 MySQL에서 히스토그램을 신속하게 만드는 방법, 다음 쿼리를 사용할 수 있습니다.

SELECT grade, 
       COUNT(\*) AS 'Count',
       RPAD('', COUNT(\*), '*') AS 'Bar' 
FROM grades 
GROUP BY grade

다음 표를 생성합니다.

grade   Count   Bar
1       2       **
2       1       *
3       1       *
4       1       *
5       1       *

Ilya Volodin이 위에서 한 일을 바탕으로 결과에서 함께 그룹화하려는 다양한 등급을 선택할 수 있어야합니다.

DECLARE @cnt INT = 0;

WHILE @cnt < 100 -- Set max value
BEGIN
SELECT @cnt,COUNT(fe) FROM dbo.GEODATA_CB where fe >= @cnt-0.999 and fe <= @cnt+0.999 -- set tolerance
SET @cnt = @cnt + 1; -- set step
END;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top