2016-04-10 8 views
0

Ich habe ein Problem, das ich für mich selbst als eine Herausforderung erstellt habe und ich brauche deine Hilfe.Python sqlite3 Wert Lookup

Ich habe zwei Tabellen. [Studenten] - die Spalten mit Namen, natürlich punkten [gradingscheme] - die Spalten enthalten Brief, oberen, untere

Die [gradingscheme] Tabelle im Grunde als eine Nachschlagtabelle dienen existiert, so dass, wenn meine Punktzahl von [ Studenten] liegt zwischen der oberen und unteren Grenze von [Gradingscheme], nimmt sie den Textwert der Buchstabenspalte auf. (Ich bin mir bewusst, dass man einfach einen Fall tun, WENN, DANN einen Brief Klasse zuweisen, aber ich versuche, meine Wissensbasis zu erweitern)

import sqlite3 
conn = sqlite3.connect('example3.db') 
c = conn.cursor() 

c.execute('''         
UPDATE students          
SET LetterGrade = CASE 
    WHEN score between 90 and 100 then 'A' 
    WHEN score between 80 and 90 then 'B' 
    ELSE 'C' 
END 
''')           

c.execute(''' 
SELECT s.name,s.courseid,c.name,c.classroom,s.score,s.LetterGrade 
FROM students AS s 
LEFT OUTER JOIN courses AS c 
WHERE s.courseid=c.courseid 
''')           

import pprint 
pp=pprint.PrettyPrinter() 
pp.pprint(c.fetchall())   

conn.commit() 
conn.close() 

Das ist, was ich bisher habe, und es ist die UPDATE/SET Teil, den ich versuche, in dieser Herausforderung zu ersetzen. Ich habe keine Ahnung, wie ich das ausführen soll. Jede Hilfe wird geschätzt!

+0

Welchen Code haben Sie bisher ausprobiert? – tfv

+0

Zeigen Sie Ihren Code. Und wo steckst du fest? – TheRandomGuy

Antwort

1
  1. Ihr Benotungsschema ist nicht eindeutig. Z.B. SELECT 90 BETWEEN 90 AND 100; wird als wahr ausgewertet, genauso wie es SELECT 90 BETWEEN 80 AND 90; tut. Sie sollten wahrscheinlich lieber Bereiche wie 90-100, 80 - 89, 70 - 79, ... verwenden.
  2. Müssen Sie wirklich den Benotungsbrief der Schüler-Tabelle hinzufügen? Normalerweise würde man einfach den Buchstaben aus der Gradingschementabelle beitreten, wenn eine solche Auswahl durchgeführt wird. Z.B. SELECT s.name, s.course, g.letter FROM students s, gradingscheme g WHERE s.score BETWEEN g.lower AND g.upper;. Sie können sogar eine Ansicht erstellen, um dies automatisch zu machen. Dies vermeidet Redundanz in Ihren Daten.
  3. Wenn Sie die Briefklassifizierung explizit der Schüler-Tabelle hinzufügen möchten, könnten Sie etwas wie UPDATE students SET letterGrade = (SELECT letter FROM gradingscheme WHERE score BETWEEN lower AND upper); versuchen.
+0

Vielen Dank! Ihr Vorschlag Nr. 2 war genau das, was ich suchte, aber ich wusste nicht, dass es möglich war; daher der schlechte Versuch, eine Briefgruppensäule zu schaffen. –