사용자 및 등급이 포함 된 SQL Server 테이블이 있습니다. 간단히하기 위해, 2 개의 열이 있다고 가정 해 봅시다- name
& grade
. 따라서 일반적인 행은 이름 : “John Doe”, Grade : “A”입니다.
가능한 모든 답변의 백분율을 찾을 수있는 하나의 SQL 문을 찾고 있습니다. (A, B, C 등 …) 또한 가능한 모든 대답을 정의하지 않고이 작업을 수행 할 수있는 방법이 있습니까 (열린 텍스트 필드-사용자는 ‘통과 / 실패’, ‘없음’등을 입력 할 수 있습니다 …)
내가 찾고있는 최종 출력은 A : 5 %, B : 15 %, C : 40 % 등입니다.
답변
나는 다음을 테스트했으며 이것이 효과가 있습니다. gordyii의 대답은 가까웠지만 잘못된 위치에 100의 곱셈이 있었고 괄호가 누락되었습니다.
Select Grade, (Count(Grade)* 100 / (Select Count(*) From MyTable)) as Score
From MyTable
Group By Grade
답변
-
가장 효율적입니다 (over () 사용).
select Grade, count(*) * 100.0 / sum(count(*)) over() from MyTable group by Grade
-
범용 (모든 SQL 버전)
select Grade, count(*) * 100.0 / (select count(*) from MyTable) from MyTable group by Grade;
-
CTE를 사용하면 효율성이 가장 떨어집니다.
with t(Grade, GradeCount) as ( select Grade, count(*) from MyTable group by Grade ) select Grade, GradeCount * 100.0/(select sum(GradeCount) from t) from t;
답변
총계를 얻기 위해 별도의 CTE를 사용하는 대신 “partition by”절없이 창 함수를 사용할 수 있습니다.
사용중인 경우 :
count(*)
그룹의 수를 얻으려면 다음을 사용할 수 있습니다.
sum(count(*)) over ()
총 수를 얻을 수 있습니다.
예를 들면 다음과 같습니다.
select Grade, 100. * count(*) / sum(count(*)) over ()
from table
group by Grade;
내 경험상 더 빠르지는 않지만 내부적으로 임시 테이블을 사용하는 경우가 있다고 생각합니다 ( “set statistics io on”으로 실행할 때 “작업 테이블”을 보았습니다).
편집 :
내 예제 쿼리가 당신이 찾고있는 것인지 확실하지 않습니다. 윈도우 기능이 어떻게 작동하는지 보여줍니다.
답변
총 등급을 계산해야합니다. SQL 2005 인 경우 CTE를 사용할 수 있습니다.
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
답변
등급 필드를 기준으로 그룹화해야합니다. 이 쿼리는 거의 모든 데이터베이스에서 원하는 것을 제공합니다.
Select Grade, CountofGrade / sum(CountofGrade) *100
from
(
Select Grade, Count(*) as CountofGrade
From Grades
Group By Grade) as sub
Group by Grade
사용중인 시스템을 지정해야합니다.
답변
백분율을 계산해야 할 때만 사용합니다.
ROUND(CAST((Numerator * 100.0 / Denominator) AS FLOAT), 2) AS Percentage
100.0은 소수를 반환하지만 100 자체는 ROUND () 함수를 사용하더라도 결과를 가장 가까운 정수로 반올림합니다!
답변
다음은 작동합니다
ID - Key
Grade - A,B,C,D...
편집 : 정수 나누기를하지 않도록를 이동 * 100
하고 추가1.0
Select
Grade, Count(ID) * 100.0 / ((Select Count(ID) From MyTable) * 1.0)
From MyTable
Group By Grade
