2012-05-22 30 views
7

MySQL için bir SQL sorgusu yazarken bazı sorunlarım var. Bu gibi görünmelidirSQL sorgu ile avg ve grup tarafından

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

sorgunun sonucunu: Ben tablosundan aşağıdaki bilgileri ayıklar bir sorgu oluşturmak istiyorum

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 | 

: Aşağıdaki yapıya sahip bir tablo var

Tabii ki her bir 'id' için daha fazla satır içeren

.

Zaten

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

Bu doğru sonucu verir gibi bazı sorgular çalıştı ama

I (7 adet) 'pas' diğer olası değerleri için sonuçlar ile genişletmek zorunda İç içe geçmiş bir SELECT'i AVG içinde kullanmaya çalıştı ancak bu işlem işe yaramadı çünkü geçerli 'id' ile doğru şekilde nasıl sınırlandırılacağını anlamadım.

Daha sonra 'pass' = 1, 'pass' = 2, vb. Için her bir sorgunun sonucunu temsil etmek için Views oluşturdum. Ancak çoğu ids için 'pass' için en yüksek değer 5'tir. JOIN sorgularını kullanırken Görünümlerin son sonucu boş bir sonuç kümesi aldım, çünkü bazı Görünümler boş/belirli bir 'id' için değerler yok.

Herhangi bir fikrin var mı? Her kimliği için sadece bir satır istiyorsanız, bu

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

Veya: Ne istediğini anlamak

+0

Sen 'pas ile' 3 'kayıtları var = 5', hepsi farklı kimliklerle. Bunlardan hangisini istiyorsun? Lütfen sağladığınız veriler için beklediğiniz çıktıyı yayınlayın. – Quassnoi

+0

AVG değeriniz sütunlarda mı yoksa istenen sorguda kaç satır olduğu kadar çok sayıda geçiş değeri var mı? –

+0

Sorumu düzenledim ve sonucumu nasıl beklediğime dair bir tablo ekledim. Sonucu başka bir programa beslemem gerekiyor, bu yüzden her satırda bir kimlik olmalı. – theFen

cevap

20

, bu deneyin

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

bunu istemiyor. Bu 5 satır dönecek ve o sadece tüm verileri ile bir tane istiyorum. –

+0

@theFen: Düzenlenmiş sorgumu deneyin. – Marco

+0

+1 şimdi bu daha çok: D –