2011-01-17 6 views
0

Ich versuche, ein wenig auf eine Aussage zu erweitern, dass ich letzte Woche Hilfe erhalten habe. Wie Sie sehen können, richte ich eine temporäre Tabelle ein und füge Reihen von Schülerdaten aus einem kürzlich durchgeführten Test für ein paar Dutzend Schulen ein. Wenn die Zeilen eingefügt werden, werden sie nach der Punktzahl sortiert (totpct_stu, hoch zu niedrig) und die Zeilennummer wird hinzugefügt, wobei 1 die höchste Punktzahl usw. darstellt.Modifizieren MySQL INSERT-Anweisung, um das Einfügen bestimmter Zeilen zu unterlassen

Ich habe gelernt, dass es einige Probleme in der Schule gab. 9999 in SMITHs Klasse (jeder Schüler machte eine perfekte Punktzahl und sie waren die einzigen Schüler im Distrikt). Also möchte ich SMITHs Klasse nicht importieren.

Wie Sie sehen können, habe ich SMITHs Klasse gelöscht, aber das hat die Zeilennummerierung für den Rest des Schülers in der Schule durcheinander gebracht (z. B. Highscore row_number ist jetzt 20, nicht 1).

Wie kann ich die INSERT-Anweisung ändern, um diese Klasse nicht einzufügen?

DROP TEMPORARY TABLE IF EXISTS avgpct ; 
CREATE TEMPORARY TABLE avgpct_1 
    (sch_code VARCHAR(3), 
    schabbrev VARCHAR(75), 
    teachername VARCHAR(75), 
    totpct_stu DECIMAL(5,1), 
    row_number SMALLINT, 
    dummy  VARCHAR(75) 
    ); 
-- ---------------------------------------- 
INSERT INTO avgpct 
SELECT sch_code 
    , schabbrev 
    , teachername 
    , totpct_stu 
    , @num := IF(@GROUP = schabbrev, @num + 1, 1) AS row_number 
    , @GROUP := schabbrev AS dummy 
    FROM sci_rpt 
WHERE grade = '05' AND 
     totpct_stu >= 1 -- has a valid score 
ORDER 
    BY sch_code, totpct_stu DESC ; 
-- --------------------------------------- 
-- select * from avgpct ; 
-- --------------------------------------- 
DELETE 
    FROM avgpct_1 
WHERE sch_code = '9999' AND 
     teachername = 'SMITH' ; 

Antwort

1
INSERT INTO avgpct 
SELECT sch_code 
    , schabbrev 
    , teachername 
    , totpct_stu 
    , @num := IF(@GROUP = schabbrev, @num + 1, 1) AS row_number 
    , @GROUP := schabbrev AS dummy 
    FROM sci_rpt 
WHERE grade = '05' AND 
     totpct_stu >= 1 -- has a valid score 
     AND NOT (sch_code = '9999' AND 
     teachername = 'SMITH') 
ORDER 
    BY sch_code, totpct_stu DESC ; 
+0

Nun, das bekommt es. Ich hatte folgendes versucht, aber die Frage wurde in der Luft und hörte nicht auf. Vielen Dank! – dave

+0

... WHERE Klasse = '05' UND totpct_stu> = 1 UND NICHT IN (wählen * aus sci_rpt wobei sch_code = '9999' und teachername = 'SMITH') ... – dave

0

Etwas in dieser Richtung arbeiten könnte. In der Testumgebung, ändern Sie diese

WHERE grade = '05' AND 
     totpct_stu >= 1 -- has a valid score 

dieser

WHERE grade = '05' AND 
     totpct_stu >= 1 AND NOT -- has a valid score 
     (sch_code = '9999' AND teachername = 'SMITH') 

Aber, wenn ich Sie wäre, würde ich erwarten, dass Ausschlüsse ein wiederkehrendes Problem. Vielleicht nicht häufig, aber regelmäßig wiederkehrend. Das würde einen tabellenbasierten Ansatz nahelegen - Dinge, die ausgeschlossen werden sollen, in einer Tabelle zu speichern, anstatt sie in den SQL-Anweisungen zu "speichern".

+0

Danke! Ja, bisher arbeite ich an einem "nur einmal" Projekt, aber ich stimme dir zu. – dave