I have a table SQL Server 사용자가 포함된 &. 그들의 성적은. # 39 의 simplicity&, s sake), 2 단, 지금 그 말 - '이름' & 수 있습니다. '등급'. 그래서 일반적인 행일 약간만이라도 이름: 존 Doe" ";;; A" Grade:".
급, count () 100.0 선택 (select count (*) from 미터블) / 미터블 에서 그룹순 등급.
와 t (등급, 그라데카운트) tpc. ( 급, select count (*) 미터블 에서 그룹순 등급 )
별도의 스테 사용하는 대신 사용할 수 있습니다, 파티션에만 " 없이 창 함수은 afaq 총 by". 핵심이 되는 말이다.
를 사용할 경우
count(*)
그룹의 카운트입니다 얻기 위해 사용할 수 있습니다.
sum(count(*)) over ()
총 수 있습니다.
예를 들면 다음과 같습니다.
select Grade, 100. * count(*) / sum(count(*)) over ()
from table
group by Grade;
하지만 난 내 경험을 더 빠를 수도 있지만 내부적으로 경향이 있습니다 사용할 경우에 따라 임시 테이블 (I& # 39, ve seen " Worktable"; 설정되었습니다 on" " 실행할 때, 통계, 입출력 (i / o).
총 계산하십시오 성적이 봐야 합니다. Sql 2005년 경우 스테 사용할 수 있습니다.
WITH Tot(Total) (
SELECT COUNT(*) FROM table
)
SELECT Grade, COUNT(*) / Total * 100
--, CONVERT(VARCHAR, COUNT(*) / Total * 100) + '%' -- With percentage sign
--, CONVERT(VARCHAR, ROUND(COUNT(*) / Total * 100, -2)) + '%' -- With Round
FROM table
GROUP BY Grade
이것은, I believe it 솔루션, Informix Dynamic Server, 일반적으로 사용하는 IBM 11.50.FC3. 하지만, 제가 테스트되었습니다. 다음 검색어:
SELECT grade,
ROUND(100.0 * grade_sum / (SELECT COUNT(*) FROM grades), 2) AS pct_of_grades
FROM (SELECT grade, COUNT(*) AS grade_sum
FROM grades
GROUP BY grade
)
ORDER BY grade;
아래에 나와 있는 다음 출력입니다 보기입니다 테스트 데이터를 수평선. 이 '차' 기능을 특정 dbms 수 있지만 미삭 (아마도) 가 아닙니다. (참고로 난 변경일 100 100.0, 산술, 소수점 숫자 계산을 하기 위해 사용하는 테스트타사의 비사양 정수 - - 덕분에 의견 및 볼 수 없습니다.)
grade pct_of_grades
CHAR(1) DECIMAL(32,2)
A 32.26
B 16.13
C 12.90
D 12.90
E 9.68
F 16.13
< hr>;
CREATE TABLE grades
(
id VARCHAR(10) NOT NULL,
grade CHAR(1) NOT NULL CHECK (grade MATCHES '[ABCDEF]')
);
INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1002', 'B');
INSERT INTO grades VALUES('1003', 'F');
INSERT INTO grades VALUES('1004', 'C');
INSERT INTO grades VALUES('1005', 'D');
INSERT INTO grades VALUES('1006', 'A');
INSERT INTO grades VALUES('1007', 'F');
INSERT INTO grades VALUES('1008', 'C');
INSERT INTO grades VALUES('1009', 'A');
INSERT INTO grades VALUES('1010', 'E');
INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1012', 'F');
INSERT INTO grades VALUES('1013', 'D');
INSERT INTO grades VALUES('1014', 'B');
INSERT INTO grades VALUES('1015', 'E');
INSERT INTO grades VALUES('1016', 'A');
INSERT INTO grades VALUES('1017', 'F');
INSERT INTO grades VALUES('1018', 'B');
INSERT INTO grades VALUES('1019', 'C');
INSERT INTO grades VALUES('1020', 'A');
INSERT INTO grades VALUES('1021', 'A');
INSERT INTO grades VALUES('1022', 'E');
INSERT INTO grades VALUES('1023', 'D');
INSERT INTO grades VALUES('1024', 'B');
INSERT INTO grades VALUES('1025', 'A');
INSERT INTO grades VALUES('1026', 'A');
INSERT INTO grades VALUES('1027', 'D');
INSERT INTO grades VALUES('1028', 'B');
INSERT INTO grades VALUES('1029', 'A');
INSERT INTO grades VALUES('1030', 'C');
INSERT INTO grades VALUES('1031', 'F');
이 그룹 개별 선택 쿼리하지 에서 사용할 수 있습니다 (테스트 및 확신하지 못하고 원하는거요 빠름):
SELECT Grade, COUNT(*) / TotalRows
FROM (SELECT Grade, COUNT(*) As TotalRows
FROM myTable) Grades
GROUP BY Grade, TotalRows
또는
SELECT Grade, SUM(PartialCount)
FROM (SELECT Grade, 1/COUNT(*) AS PartialCount
FROM myTable) Grades
GROUP BY Grade
또는
SELECT Grade, GradeCount / SUM(GradeCount)
FROM (SELECT Grade, COUNT(*) As GradeCount
FROM myTable
GROUP BY Grade) Grades
저장 프로시저를 사용할 수도 있습니다 (대한 사과를 불새 구문):
SELECT COUNT(*)
FROM myTable
INTO :TotalCount;
FOR SELECT Grade, COUNT(*)
FROM myTable
GROUP BY Grade
INTO :Grade, :GradeCount
DO
BEGIN
Percent = :GradeCount / :TotalCount;
SUSPEND;
END