2016-09-10 2 views
1

새 열에서 백분율을 얻으려면 SQL Server에서보기를 만드는 사람을 도울 수 있습니까? 예를 들어 아래 두 개의 표가 있습니다.두 표를 사용하여 bool로 열의 백분율 계산하기

Table 1---> Subject   |  Table 2---->Exam 
          | 
SubjectID  SubName  |  ExamID SubjectID Result (bool) 
    1   Science  |  1  1   1 
    2   Maths   |  2  1   1 
    3   English  |  3  1   0 
    4   History  |  4  2   0 
    5   Art   |  5  2   1 
    6   Geography  |  6  3   0 
          |  7  4   1 
          | 

많은 피사체에는 시험이 없으므로 결과가 결합 된보기에서 null이됩니다. 나는 과목의 합격률을 보여주고 싶다. 예를 들어 결과 열에서 1 = 통과, 0 = 실패입니다. 결과가 아래처럼 보이도록 null 필드도 표시하고 싶습니다. 여기

SubjectID SubName PassPercentage 
    1  Science  66.66 
    2  Maths   50 
    3  English  0 
    4  History  100 
    5  Art   null 
    6  Geography  null 

답변

3

: 당신이 원하는 경우

SELECT 
Subject.SubjectId, 
Subject.SubName, 
(AVG(CONVERT(decimal,Exam.Result))*100) AS PassPercentage 
FROM Subject 
LEFT JOIN Exam on Subject.SubjectId = Exam.SubjectId 
GROUP BY Subject.SubjectId, Subject.SubName 

당신은 라운드 비율 결과 (2 소수없이) 및 % 기호를 추가 할 수 있습니다.

0

는 수행

select s.SubjectID, s.SubName, 
case COUNT(e.Result) 
    when 0 then null 
    else SUM(CAST(e.Result AS INT)) * 100/(COUNT(s.SubjectID)) 
end PassPrec 

from Subject s 
left join Exam e on s.SubjectID = e.SubjectID 
group by s.SubjectID, s.SubName 

이 사건은 널 (null)을 얻는 것입니다. null은 "count"함수에서 계산되지 않습니다.

+0

count (*) – scsimon

+0

예를 사용하면 Null은 count를 사용하여 계산되지만 계산하지 않으려합니다. 나는 현재의 주제에 대한 결과가 없다는 것을 알아 내기 위해 계산되지 않는다는 사실을 이용하고 있습니다. 그래서 '널 (null)'값이 % 열로 지정됩니다. –

+0

코드가 잘못되었음을 말하지 않았습니다. 마지막 문장에주의를 기울이십시오. – scsimon

0

당신이

;with cte1 as (
select subjectid, sum(result) ResultCount 
from exam group by subjectid 
), cte2 as (
select e.subjectid, c.ResultCount, count(e.examid) TotalExams from cte1 c 
left join exam e on e.subjectid = c.subjectid 
group by e.subjectid, c.ResultCount 
) select s.subname, convert(decimal(10,2), (c.ResultCount/convert(decimal(10,2),c.TotalExams)) *100) as Percentage from subject s left join cte2 c 
on s.subjectid = c.subjectid 
1

사용처럼이 쿼리를 코드를 사용할 수 있습니다

Select *, 
(Select Avg(Cast(Result as decimal)) From Exam Where SubjectID=S.SubjectID)*100 as PassPercentage 
From Subject as S 

결과는 다음과 같습니다

SubjectID SubName   PassPercentage 
----------- --------------- --------------------------------------- 
1   Science   66.666600 
2   Maths   50.000000 
3   English   0.000000 
4   History   100.000000 
5   Art    NULL 
6   Geography  NULL 

(6 row(s) affected) 

하위 쿼리는 주제 테이블의 각 행에 대해 실행됩니다.

관련 문제