2012-05-22 15 views
7

Ho alcuni problemi con la scrittura di una query SQL per MySQL. Ho una tabella con la seguente struttura:Query SQL con avg e group per

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 | 

Voglio creare una query che estrae le seguenti informazioni dalla tabella:

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

Il risultato della query dovrebbe essere simile a questo:

+------------+---------+---------+---------+---------+---------+---------+---------+ 
| 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  | 
+------------+---------+---------+---------+---------+---------+---------+---------+ 

con più righe per ogni "ID" univoco, ovviamente.

ho già provato alcune domande come

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

Ciò restituisce il risultato corretto, ma devo espanderla con risultati per gli altri valori possibili di 'passaggio' (fino a 7)

I ho provato ad usare un SELECT nidificato in AVG, ma questo non ha funzionato perché non ho capito come limitarlo correttamente all''ID corrente.

Ho quindi creato Views per rappresentare il risultato di ogni query per 'pass' = 1, 'pass' = 2, ecc. Ma per la maggior parte degli id ​​il valore più alto per 'pass' è 5. Quando si usano le query JOIN per ottenere il risultato finale dalle viste che ho ricevuto un set di risultati vuoto, perché alcune delle viste sono vuote/non hanno valori per uno specifico 'id'.

Qualche idea?

+0

Hai '3' record con' passaggio = 5', tutti con ID diversi. Quale di questi 'id' vuoi? Per favore pubblica l'output che ti aspetteresti per i dati che hai fornito. – Quassnoi

+0

Il valore AVG deve essere in colonne o la query desiderata può restituire tante righe quante sono i valori di passaggio diversi? –

+0

Ho modificato la mia domanda e ho aggiunto una tabella su come mi aspetto il mio risultato. Devo dare il risultato ad un altro programma, quindi dovrebbe esserci un id per riga. – theFen

risposta

20

Se ho capito quello che ti serve, provare questo:

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

Oppure, se si desidera solo una riga per ogni ID, questo:

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

non lo desidera. questo restituirà 5 righe e ne vorrà una con tutti i dati. –

+0

@theFen: prova la mia query modificata. – Marco

+0

+1 ora è più simile a questo: D –

Problemi correlati