web-dev-qa-db-ger.com

SQL-Abfrage mit avg und group by

Ich habe Probleme beim Schreiben einer SQL-Abfrage für MySQL. Ich habe eine Tabelle mit folgender Struktur:

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 möchte eine Abfrage erstellen, 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 folgendermaßen 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       |
+------------+---------+---------+---------+---------+---------+---------+---------+

natürlich mit mehr Zeilen für jede eindeutige 'ID'. 

Ich habe schon ein paar Fragen wie versucht

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

Dies gibt das korrekte Ergebnis zurück, aber ich muss es mit den Ergebnissen für die anderen möglichen Werte von 'pass' (bis zu 7) erweitern.

Ich habe versucht, ein verschachteltes SELECT innerhalb von AVG zu verwenden, aber das hat nicht funktioniert, weil ich nicht herausgefunden habe, wie ich es richtig auf die aktuelle 'id' beschränken kann.

Ich habe dann Views erstellt, um das Ergebnis jeder Abfrage für 'pass' = 1, 'pass' = 2 usw. darzustellen. Bei den meisten IDs ist der höchste Wert für 'pass' 5. Bei Verwendung von JOIN-Abfragen wird das Endergebnis abgerufen Die Ansichten Ich habe eine leere Ergebnismenge erhalten, da einige Ansichten leer sind/keine Werte für eine bestimmte 'ID' haben.

Irgendwelche Ideen?

10
theFen

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

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 haben möchten:

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
28
Marco

Nach meinem Verständnis möchten Sie bei jedem Durchlauf den Durchschnittswert für jede ID. Die Lösung ist

SELECT id, pass, avg(value) FROM data_r1
GROUP BY id, pass;
1