2016-09-10 10 views
1

誰かがSQL Serverでビューを作成して新しい列にパーセンテージを得る手助けをしてもらえますか?たとえば、次のような2つのテーブルがあります。2つのテーブルを使用して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

yesを使用すると、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) 

サブクエリは、対象テーブルの行ごとに実行されます。

関連する問題