[sql] SQL 문으로 백분율을 계산하는 방법

사용자 및 등급이 포함 된 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


답변

  1. 가장 효율적입니다 (over () 사용).

    select Grade, count(*) * 100.0 / sum(count(*)) over()
    from MyTable
    group by Grade
  2. 범용 (모든 SQL 버전)

    select Grade, count(*) * 100.0 / (select count(*) from MyTable)
    from MyTable
    group by Grade;
  3. 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