2012-05-22 2 views
7

MySQL에 대한 SQL 쿼리를 작성하는 데 문제가 있습니다. 다음과 같아야합니다평균 및 그룹이있는 SQL 쿼리

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

쿼리의 결과 : 나는 테이블에서 다음과 같은 정보를 추출하는 쿼리를 만들려면

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 | 

: 나는 다음과 같은 구조의 테이블이

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

각 고유 한 'id'에 대해 더 많은 행이있는 것은 물론입니다.

는 이미

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

이 올바른 결과를 반환과 같은 몇 가지 질의를했지만, 나는

I (7 개) '패스'의 다른 가능한 값에 대한 결과를 확장해야 AVG 내에서 중첩 된 SELECT를 사용하려고했으나 올바르게 작동하지 못했기 때문에 작동하지 않았습니다.

그런 다음 'pass'= 1, 'pass'= 2 등의 각 쿼리 결과를 나타내는 Views를 만들었지 만 대부분의 ID의 경우 'pass'의 가장 높은 값은 5입니다. JOIN 쿼리를 사용하면 뷰의 최종 결과는 뷰의 일부가 비어 있거나 특정 'id'값이 없으므로 빈 결과 집합을 받았습니다.

아이디어가 있으십니까? 당신은 모든 ID에 대해 하나 개의 행을 원하는 경우,이

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

을 또는 : 나는 당신이 필요로 이해한다면

+0

을 당신은'패스'3' 기록이 = 5', 모두 다른 ID를 사용합니다. 이 'id'중 원하는 것은 무엇입니까? 입력 한 데이터에 대해 예상되는 결과를 게시하십시오. – Quassnoi

+0

AVG 값이 열에 있어야합니까, 아니면 원하는 쿼리가 많은 다른 패스 값만큼 많은 행을 반환 할 수 있습니까? –

+0

내 질문을 편집하고 결과를 기대하는 표를 추가했습니다. 결과를 다른 프로그램에 공급해야하므로 행당 하나의 ID가 있어야합니다. – theFen

답변

20

이 시도

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

그는 이것을 원하지 않습니다. 이렇게하면 5 개의 행이 반환되고 모든 데이터가있는 행이 하나만 필요합니다. –

+0

@theFen : 편집 한 쿼리를 사용해보십시오. – Marco

+0

+1 이제 더 좋아졌습니다 : D –