2017-05-16 6 views
0

Ich habe die folgende select-Anweisung. Ich habe Schulen, Kurse, Studenten und Noten (1-100). Ich möchte eine Note (A, B, C, D) vergeben und dann die Gesamtzahl der Schüler in jeder Klasse erhalten. Meine Ergebnisse zeigen nur die Anzahl der jede Markierung obwohl und nicht die Zählung der KlasseWeisen Sie den Schülern eine Note zu und erhalten Sie für jede Note eine Summe.

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 

Was ich jetzt ist die Anzahl der einzelnen Markierungen (zB 5 Studenten bekamen 88%, 3 bekamen 85% usw.)

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 

Was will ich es sehe, ist die Summe der Zählung jeder Klasse (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

Warum Oracle-Anwender neigen dazu, die alte implizite Verknüpfungen zu benutzen? – Parfait

+0

Es ist ein alter Code, den ich ändern möchte. Ich verwende normalerweise den expliziten Join;) – EvilEddie

+0

Entferne die group von on ', standardgrades.averageScore' und ändere' count (*) 'in' count (*) Over (partition by {deine case-Anweisung}) ' – xQbert

Antwort

1

Sie müssen nach der berechneten Note statt der durchschnittlichen Punktzahl gruppieren. Sie können dazu ein CTE, eine Unterabfrage oder den gesamten Ausdruck in der Gruppenklausel wiederholen.

Ich finde CTE-basierte Lösung Bit leicht zu lesen:

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; 

Auch immer Verwendung moderner explizite Join-Syntax anstelle der alten Komma Basis verbindet.

+0

Das ist knapp aber es zeigt die Zählung der Notenspalte in der Originaltabelle anstelle der Gesamtanzahl der Spalte "Anzahl" an. Also, es zählt 7 Zeilen von A statt 5 + 3 + 2 + 1 + 1 + 2 + 3 = 17 ------------------------ --------------------------------------- Name der Schule Kursnote St. Joe Schule \t MATH 30 A 7 – EvilEddie

+0

@EvilEddie - Ihre eigenen Beispieldaten zeigen, dass es 17 sein sollte. Bitte fügen Sie auch Beispiel-Eingabedaten hinzu, wenn Sie weitere Hilfe benötigen. – GurV

+0

Entschuldigung ... das Kommentarfeld erlaubt keine großartige Formatierung. Das korrekte zurückgegebene Ergebnis sollte 17 sein (insgesamt die ersten sieben Zeilen in der vierten Spalte mit der Bezeichnung Count), aber das Ergebnis, das ich erhalte, ist 7 (insgesamt die ersten 7 Zeilen in der dritten Spalte, Grade genannt). – EvilEddie

0

die Abfrage, die Sie in eine Ansicht haben setzen und es dann mit einer anderen Gruppe abfragen BY und SUMME.

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

Nur nicht aus, auf Ihre vorhandene Abfrage wie unten wie:

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; 
Verwandte Themen