데이터베이스의 열 값에서 히스토그램을 생성합니다
-
20-08-2019 - |
문제
다음과 같은 데이터베이스 열 '등급'이 있다고 가정 해 봅시다.
|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;