2016-06-05 7 views
0

I Beispieldaten (Ergebnistabelle), die wie wiederholt:Konvertieren älterer MySQL-Skript Postgres 9.5

year,teacher, score, class, state 
2016, Jones, 80, math 102, NC 
2016, Smith, 66, history, KY 
2016, Jones, 40, math 101, SC 
2014, Jones, 60, science, AK 

ich eine neue Übersichtstabelle (Lehrer) erstellen möchten, die Lehrer umfasst, Score mittelt, Jahr und von Lehrern bestellt Klasse:

teacher, average, class, state 
Jones, 60, 2016, math, NC SC 

Mein ursprünglichen (älteren) mysql Skript sah ähnlich wie:

SELECT 
    teacher, class, 
    AVG(case when class rlike 'match' THEN score END) tlevel_avg, 
GROUP_CONCAT(DISTINCT(state) order by state SEPARATOR ' ') 
FROM results 
group by teacher 
order by tlevel_avg desc 
where year like '2012' 

es e In Datei portiert.

Ich habe versucht, das gleiche Ergebnis mit Postgres zu bekommen, aber ich erhalte einzigartige Lehrer mit dem gleichen Daten für jeden (presumabley, weil ich eine select für avg erstellt, ohne in dem für Lehrer-Wert)

bin ich nicht sicher, wie um diese Abfrage so zu organisieren, dass avg sich auf einen bestimmten Lehrer bezieht.

SELECT distinct teacher, 
(select AVG(CASE when results.class SIMILAR TO '%math%' THEN results.score END) as training_level_avg from results) 
(select AVG(CASE when results.class SIMILAR TO '%science%' THEN results.score END) as training_level_avg from results) 
FROM RESULTS 
WHERE teacher NOT LIKE '%temporary%' 
AND results.year = '2011' 
GROUP by results.teacher 

Hauptsächlich ein Jahr gegeben durch Lehrer gruppiert Ich versuche, die Daten zurückgegeben mit korrekt berechneten Mittelwerte für alle Vorkommen für die Klasse zu erhalten, aber ich muss auch dieses Ergebnis auf eine andere Tabelle ‚Lehrer‘ schreiben (Bonus-Frage).

Jede Hilfe meine über den Buckel bekommen wird sehr geschätzt

+2

Wenn Sie ersetzen 'group_concat()' mit 'string_agg()' und verwenden Sie 'Gruppe nach Lehrer, Klasse ', die Sie wollen Sie wollen. –

Antwort

0

Ihre Abfrage wie folgt möchte:

SELECT teacher, class, 
     AVG(case when class = 'match' THEN score END) as tlevel_avg, 
     STRING_AGG(DISTINCT state ORDER BY state, ' ') as states 
FROM results 
where year = '2012' 
GROUP BY judge 
ORDER BY tlevel_avg DESC; 

string_agg() ist das Äquivalent von group_concat(), obwohl die Syntax etwas anders.

Ich erinnere mich nicht, wenn es einen Unterschied gibt, wie Groß-/Kleinschreibung behandelt wird. Sie können die = 'match' durch ilike 'match' ersetzen, wenn der Fall ein Problem sein könnte.

+0

Ich bekomme diesen Fehler beim Ausführen: 'ERROR: Funktion String_agg (Zeichen variiert) ist nicht vorhanden LINE 3: STRING_AGG (DISTINCT Status ORDER BY Zustand, '') als sta ... ^ HINWEIS: Keine Aggregatfunktion entspricht der Vorgegebene Namen und Argumenttypen. Vielleicht hast du ORDER BY verlegt; ORDER BY muss nach allen regulären Argumenten des Aggregats erscheinen. ' –

+0

Dank Gordon-diese Änderung scheint zu arbeiten:' AVG (Fall, wenn Klasse ilike '% Training%' DANN Ergebnis ENDE) als tlevel_avg, STRING_AGG (DISTINCT Zustand, '' ORDER BY Zustand) als Staaten' –

Verwandte Themen