2017-05-16 59 views
0

我有以下select語句。我有學校,課程,學生和分數(1-100)。我想分配一個等級(A,B,C,D),然後獲得每個年級的學生總數。我的成績只能說明每個標記的次數,但並沒有等級的計數指定學生一年級並獲得每個年級的總計

select   
    schools.name as school_name,    
    courses.name as course, 
     CASE 
      WHEN ((studentgrades.averageScore/50 * 100) > 79) 
        THEN 'A' 
        WHEN ((studentgrades.averageScore/50 * 100) < 80) 
         AND ((studentgrades.averageScore/50 * 100) >64) 
        THEN 'B' 
        WHEN ((studentgrades.averageScore/50 * 100) < 80) 
         AND ((studentgrades.averageScore/50 * 100) >64) 
        THEN 'C' 
        WHEN ((studentgrades.averageScore/50 * 100) < 50) 
        THEN 'D'       
      END as grade,    
    count(*)     
from 
    students, 
    studentgrades, 
    schools, 
    courses 
where 
    studentgrades.studentid = students.studentid 
    and studentgrades.schoolid = students.schoolid  
    and studentgrades.schoolid = schools.school_number 
    and courses.id = studentgrades.coursesid 
    and studentgrades.averageScore is not null 
    and schools.name = 'St. Joe School'   
group by schools.name, courses.name,standardsgrades.averageScore 

我現在得到的是個體標記的計數(例如5名學生得到了88%,3得到85%等)

School Name  Course  Grade  Count   
St. Joe School MATH 30   A   5 
St. Joe School MATH 30   A   3 
St. Joe School MATH 30   A   2 
St. Joe School MATH 30   A   1 
St. Joe School MATH 30   A   1 
St. Joe School MATH 30   A   2 
St. Joe School MATH 30   A   3 
St. Joe School MATH 30   B   2 
St. Joe School MATH 30   B   5 
St. Joe School MATH 30   B   2 
St. Joe School MATH 30   B   1 
St. Joe School MATH 30   B   2 

我想看到它的總各等級的數量是(A,B,C,d)

School Name  Course  Grade  Count   
St. Joe School MATH 30   A   30 
St. Joe School MATH 30   B   20 
St. Joe School MATH 30   C   10 
St. Joe School MATH 30   D   5 
+0

爲什麼甲骨文用戶傾向於使用舊隱加入? – Parfait

+0

這是我想修改的一些舊代碼。我通常使用顯式連接;) – EvilEddie

+0

通過',standardsgrades.averageScore'刪除組合並將count(*)改爲count(*)Over(由{你的case語句}分區)' – xQbert

回答

1

您需要按計算成績進行分組,而不是平均分數。你可以使用CTE,子查詢或者在group子句中重複整個表達式。

我發現基於CTE解決位容易閱讀:

with cte 
as (
    select schools.name as school_name, 
     courses.name as course, 
     case when ((studentgrades.averageScore/50 * 100) > 79) then 'A' when ((studentgrades.averageScore/50 * 100) < 80) 
       and ((studentgrades.averageScore/50 * 100) > 64) then 'B' when ((studentgrades.averageScore/50 * 100) < 80) 
       and ((studentgrades.averageScore/50 * 100) > 64) then 'C' when ((studentgrades.averageScore/50 * 100) < 50) then 'D' end as grade 
    from students 
    join studentgrades on studentgrades.studentid = students.studentid 
     and studentgrades.schoolid = students.schoolid 
    join schools on studentgrades.schoolid = schools.school_number 
     and studentgrades.schoolid = schools.school_number 
    join courses on courses.id = studentgrades.coursesid 
    where studentgrades.averageScore is not null 
     and schools.name = 'St. Joe School' 
    ) 
select school_name, 
    course, 
    grade, 
    count(*) 
from cte 
group by school_name, 
    course, 
    grade; 

此外,總是利用現代明確連接語法,而不是基於加入老逗號。

+0

這很接近,但它顯示原始表格中成績列的計數,而不是「計數」列的總計數。所以它計算A的7行而不是5 + 3 + 2 + 1 + 1 + 2 + 3 = 17 ------------------------ --------------------------------------- 學校名稱課程成績總數 聖喬學校\t MATH 30 A 7 – EvilEddie

+0

@EvilEddie - 您自己的樣本數據顯示它應該是17.請添加樣本輸入數據以及如果您需要任何進一步幫助。 – GurV

+0

對不起...評論框不允許使用優秀的格式。返回的正確結果應該是17(第四列中前7行的總數稱爲Count),但我得到的結果是7(第三列前7行總數稱爲「成績」)。 – EvilEddie

0

把你的查詢到一個視圖,然後用另一組進行查詢BY和SUM。

SELECT SchoolName, Course, Grade, SUM(Count) 
FROM YourNewView 
GROUP BY SchoolName, Course, Grade 
0

只需做你現有的查詢選擇像如下:

select school_name, course, 
grade, 
sum(grade) 
(select   
schools.name as school_name,    
courses.name as course, 
    CASE 
     WHEN ((studentgrades.averageScore/50 * 100) > 79) 
       THEN 'A' 
       WHEN ((studentgrades.averageScore/50 * 100) < 80) 
        AND ((studentgrades.averageScore/50 * 100) >64) 
       THEN 'B' 
       WHEN ((studentgrades.averageScore/50 * 100) < 80) 
        AND ((studentgrades.averageScore/50 * 100) >64) 
       THEN 'C' 
       WHEN ((studentgrades.averageScore/50 * 100) < 50) 
       THEN 'D'       
     END as grade,    
count(*)     
from 
students, 
studentgrades, 
schools, 
courses 
where 
studentgrades.studentid = students.studentid 
and studentgrades.schoolid = students.schoolid  
and studentgrades.schoolid = schools.school_number 
and courses.id = studentgrades.coursesid 
and studentgrades.averageScore is not null 
and schools.name = 'St. Joe School'   
group by schools.name, courses.name,standardsgrades.averageScore) 
group by grade order by grade;