2008-08-22 9 views
0

Angenommen, ich habe eine Student-Tabelle, sie hat eine int-ID. Ich habe einen festen Satz von 10 Multiple-Choice-Fragen mit 5 möglichen Antworten. Ich habe eine normalisierte Antworttabelle, die die Frage-ID, die Student.answer (1-5) und die Student.ID hatHilfe zur SQL-Abfrage - Bewertung mehrerer Auswahltests

Ich versuche, eine einzelne Abfrage zu schreiben, die alle Ergebnisse über einen bestimmten Prozentsatz zurückgibt. Zu diesem Zweck schrieb ich eine einfache UDF, die die Student.answers und die richtige Antwort akzeptiert, so dass es 20 Parameter hat.

Ich beginne mich zu fragen, ob es besser ist, die Antworttabelle zu denormalisieren, bringen Sie es in meine Anwendung und lassen Sie meine Anwendung das Scoring machen.

Wer hat jemals so etwas in Angriff genommen und einen Einblick bekommen?

Antwort

2

Wenn ich Ihr Schema zu verstehen und hinterfragen richtig, wie wäre es so etwas wie dieses:

select student_name, score 
from students 
    join (select student_answers.student_id, count(*) as score 
     from student_answers, answer_key 
     group by student_id 
     where student_answers.question_id = answer_key.question_id 
      and student_answers.answer = answer_key.answer) 
    as student_scores on students.student_id = student_scores.student_id 
where score >= 7 
order by score, student_name 

, dass die Schüler mit einem Score von 7 oder mehr, zum Beispiel wählen sollte. Passen Sie einfach die WHERE-Klausel für Ihre Zwecke an.

0

Die Architektur, über die Sie sprechen, könnte auf lange Sicht sehr beschwerlich werden. Wenn Sie die Fragen ändern müssen, bedeutet dies mehr Änderungen an der von Ihnen verwendeten UDF.

Ich würde denken, dass Sie wahrscheinlich Ihre Analyse in Code tun könnten, ohne notwendigerweise Ihre Datenbank zu de-normalisieren. Die De-Normalisierung könnte auch zu Inflexibilität führen oder zumindest zu zusätzlichen Kosten für die Aktualisierung auf der Straße.

0

Kein Weg, Sie wollen es auf jeden Fall normalisieren. Es ist nicht einmal so schwer von einer Abfrage.

Grundsätzlich möchten Sie links die richtigen Antworten der Schüler mit den Gesamtantworten für diese Frage beitreten und zählen. Dadurch erhalten Sie den Prozentsatz richtig. Machen Sie das für jeden Schüler und setzen Sie den minimalen Prozentsatz richtig in eine where-Klausel.

1

Denormalisierung wird im Allgemeinen als letzter Ausweg betrachtet. Das Problem scheint sehr ähnlich zu Umfrageanwendungen zu sein, die sehr häufig vorkommen. Ohne Ihr Datenmodell zu sehen, ist es schwierig, eine Lösung vorzuschlagen, aber ich werde sagen, dass dies definitiv möglich ist. Ich frage mich, warum Sie 20 Parameter für diese Funktion benötigen?

Eine relationale Set-basierte Lösung wird in den meisten Fällen einfacher und schneller.

0

Diese Abfrage sollte ziemlich einfach sein ... vorausgesetzt, Sie haben die richtige Antwort in der Fragetabelle gespeichert. Sie haben die richtige Antwort in der Fragetabelle gespeichert, oder?

Verwandte Themen