Erstellen einer gewichteten Summe von Werten aus verschiedenen Tabellen

9

Ich versuche, eine Liste von Schülern zu erstellen, deren Verhalten in jeder Schuljahresgruppe statistisch gesehen am schlechtesten ist.

Wir haben eine Tabelle namens students .

Wir haben dann verhalten flags und alerts , plus sanctions .

Unterschiedliche Kategorien von Flagge / Alarm / Sanktion werden jedoch als schwerwiegender eingestuft als andere. Diese werden mit Etiketten in ihrer jeweiligen Tabelle _categories gespeichert, z. flag_categories und sanction_categories . Die Tabelle flag hat dann eine Spalte namens Category_ID ( alerts ist ein bisschen anders, da es nur ein Type -Feld mit 'A', 'C', 'P' und 'S' Werten ist) / p>

Wenn ich Daten betrachten möchte, die unsere Schüler mit der höchsten Punktzahl in einer bestimmten Jahresgruppe zeigen, würde ich diese Abfrage ausführen:

%Vor%

Wenn ich unseren Schülern die meisten Krisenwarnungen in einer bestimmten Jahresgruppe zeigen wollte, würde ich diese Abfrage ausführen:

%Vor%

Wenn ich herausfinden möchte, wie viele Spät- oder Mobil-Flags ein Student hat, und vielleicht diese zusammen (mit Gewichtungen) hinzufüge, kann ich die folgende Abfrage ausführen:

%Vor%

Was ich nicht verstehe, ist, wie ich das über unzählige Tische machen würde. Ich muss gewichten können:

  • Late ( flags , Category_ID = 10 ), Absconded ( flags , Category_ID = 15 ) und Gemeinschaftsflaggen ( flags , Category_ID = 13 ) plus Sicherheitswarnungen ( alerts , Type = 'S' ) sind alle wert 1 Punkt
  • Verhaltensflags ( flags , Category_ID IN (1, 7, 8) ) sind 2 Punkte wert
  • Prozessalarme ( alerts , Type = 'P' ) und Haftstrafen ( sanctions , Category_ID = 1 ) sind 3 Punkte wert

Also weiter und so fort. Das ist bei weitem keine erschöpfende Liste, aber ich habe genügend Variablen hinzugefügt, die mir helfen, eine multi-table gewichtete Summe zu bekommen.

Das Ergebnis, nach dem ich suche, ist nur zwei Spalten - Name und gewichtete Punkte des Schülers.

Wenn also nach den obigen Punkten ein Student 2 späte Flags (je 1 Punkt) und 1 Prozessalarm (3 Punkte) erhalten hat, sollte die Ausgabe nur Joe Bloggs und 5 heißen.

Kann mir jemand helfen, zu verstehen, wie ich diese gewichteten Werte aus verschiedenen Tabellen für jeden Schüler in eine SUMM-Ausgabe bringen kann?

[bearbeiten] SQLFiddle hier: Ссылка

    
dunc 03.08.2016, 10:46
quelle

4 Antworten

1

Beachten Sie, ich mache das nicht für die Kopfgeld. Bitte gib es jemand anderem.

Dies könnte mit ein paar LEFT JOIN s von abgeleiteten Tabellen geschehen. Beachten Sie, dass Sie die Sanktionstabelle nicht angegeben haben. Aber das Folgende scheint sehr illustrativ zu sein. Also habe ich eine temporäre Tabelle erstellt. Es scheint maximale Flexibilität zu ermöglichen, ohne einen größeren Links-Join-Begriff zu komplizentieren, der schwer zu debuggen sein könnte. Immerhin haben Sie gesagt, dass Ihre tatsächliche Abfrage viel komplizierter sein wird. Erweitern Sie als solches die temporäre Tabellenstruktur.

Dies lädt eine tmp-Tabelle mit den Standard-Nullen für die Schüler im "Übergabe-Parameter Schülerjahr " an eine gespeicherte Prozedur. Zwei Updates werden durchgeführt. Wählt dann eine Ergebnismenge aus.

Schema / Laden:

%Vor%

Gespeicherte Prozedur:

%Vor%

Test:

%Vor%

Bereinigung:

%Vor%     
Drew 08.08.2016, 06:58
quelle
1

Denken Sie, dass alles, was Sie gefragt haben, mit einer Unterabfrage und einigen Unter-SELECTs erledigt werden kann:

%Vor%

Die obige Abfrage enthält alles, was Sie erwähnt haben, abgesehen von Sanktionen (da Ihre ursprüngliche SQL Fiddle-Demo diese Tabelle nicht enthielt).

Demo

Eine aktualisierte Geige mit der obigen Abfrage ist hier: Ссылка .

    
Steve Chambers 08.08.2016 15:26
quelle
0

Sie könnten union all

verwenden

Im Grunde erstellen Sie alle Ihre individuellen Abfragen für jede Tabelle und verbinden sie alle zusammen mit union all.

Hier ist ein Beispiel, ich habe Ihre Schüler-Tabelle zweimal benutzt, aber Sie würden die zweite zu jeder anderen Tabelle ändern, die Sie wollen. SQLFiddle

    
Craig 06.08.2016 10:26
quelle
0

Du kannst es mit LEFT JOINS machen:

%Vor%

Aber wenn Sie vollen Zugriff auf die DB haben, würde ich diese Gewichte in die entsprechenden Kategorien und Typen setzen, was die Logik vereinfachen würde.

    
Arth 12.08.2016 16:34
quelle

Tags und Links