2012-05-22 12 views
7

habe ich einige Probleme mit einer SQL-Abfrage für MySQL zu schreiben. Ich habe eine Tabelle mit der folgenden Struktur:SQL-Abfrage mit avg und Gruppe von

mysql> select id, pass, val from data_r1 limit 10; 
+------------+--------------+----------------+ 
| id   | pass   | val   | 
+------------+--------------+----------------+ 
| DA02959106 | 5.0000000000 | 44.4007000000 | 
| 08A5969201 | 1.0000000000 | 182.4100000000 | 
| 08A5969201 | 2.0000000000 | 138.7880000000 | 
| DA02882103 | 5.0000000000 | 44.7265000000 | 
| DA02959106 | 1.0000000000 | 186.1470000000 | 
| DA02959106 | 2.0000000000 | 148.2660000000 | 
| DA02959106 | 3.0000000000 | 111.9050000000 | 
| DA02959106 | 4.0000000000 | 76.1485000000 | 
| DA02959106 | 5.0000000000 | 44.4007000000 | 
| DA02959106 | 4.0000000000 | 76.6485000000 | 

ich eine Abfrage erstellen möchten, die die folgenden Informationen aus der Tabelle extrahiert:

id, AVG of 'val' for 'pass' = 1, AVG of 'val' for 'pass' = 2, etc 

Das Ergebnis der Abfrage sollte wie folgt aussehen:

+------------+---------+---------+---------+---------+---------+---------+---------+ 
| id   | val_1 | val_2 | val_3 | val_4 | val_5 | val_6 | val_7 | 
+------------+---------+---------+---------+---------+---------+---------+---------+ 
| DA02959106 | 186.147 | 148.266 | 111.905 | 76.3985 | 44.4007 | 0  | 0  | 
+------------+---------+---------+---------+---------+---------+---------+---------+ 

mit mehr Zeilen für jeden eindeutig ‚id‘, natürlich.

Ich habe bereits versucht, einige Anfragen wie

SELECT id, pass, AVG(val) AS val_1 FROM data_r1 WHERE pass = 1 GROUP BY id; 

Dies gibt das richtige Ergebnis, aber ich habe für die anderen möglichen Werte von ‚pass‘ (bis zu 7)

ich es mit den Ergebnissen erweitern versucht, eine verschachtelte SELECT innerhalb AVG zu verwenden, aber das hat nicht funktioniert, weil ich nicht verstehen hätte, wie es richtig auf den aktuell ‚id‘ zu begrenzen.

Ich erstellte dann Ansichten, um das Ergebnis jeder Abfrage für 'pass' = 1, 'pass' = 2 usw. darzustellen. Aber für die meisten ids ist der höchste Wert für 'pass' 5. Bei Verwendung von JOIN-Abfragen zu bekommen das Endergebnis von den Ansichten erhielt ich eine leere Ergebnismenge, weil einige der Ansichten leer sind/haben keine Werte für einen bestimmten ‚id‘.

Irgendwelche Ideen?

+0

Sie haben '3' Datensätze mit' Pass = 5', alle mit unterschiedlichen IDs. Welche dieser 'id' willst du? Bitte veröffentlichen Sie die Ausgabe, die Sie für die von Ihnen bereitgestellten Daten erwarten würden. – Quassnoi

+0

Muss sich Ihr AVG-Wert in Spalten befinden oder kann die gewünschte Abfrage so viele Zeilen zurückgeben, wie viele verschiedene Werte vorhanden sind? –

+0

I edited meine Frage und eine Tabelle hinzugefügt, wie ich mein Ergebnis erwarten. Ich muss das Ergebnis einem anderen Programm zuführen, also sollte es eine ID pro Zeile geben. – theFen

Antwort

20

Wenn ich verstehe, was Sie brauchen, versuchen Sie dies:

SELECT id, pass, AVG(val) AS val_1 
FROM data_r1 
GROUP BY id, pass; 

Oder, wenn Sie für jede ID nur eine Zeile wollen, ist dies:

SELECT d1.id, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 1) as val_1, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 2) as val_2, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 3) as val_3, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 4) as val_4, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 5) as val_5, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 6) as val_6, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 7) as val_7 
from data_r1 d1 
GROUP BY d1.id 
+0

er dies nicht will. Das wird 5 Zeilen zurückgeben und er will nur eins mit allen Daten. –

+0

@theFen: versuche meine bearbeitete Abfrage. – Marco

+0

+1 jetzt ist es mehr wie es: D –