복붙노트

[SQL] 평균 및 그룹 별과 SQL 쿼리

SQL

평균 및 그룹 별과 SQL 쿼리

내가 MySQL을위한 SQL 쿼리를 작성하는 몇 가지 문제가있다. 나는 다음과 같은 구조의 테이블이 있습니다 :

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, AVG of 'val' for 'pass' = 1, AVG of 'val' for 'pass' = 2, etc

쿼리의 결과는 다음과 같아야합니다 :

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

이 반환 올바른 결과,하지만 난 '패스'의 다른 가능한 값에 대한 결과를 확장해야합니다 (최대 7)

저는 AVG 내에서 중첩 된 SELECT를 사용하려고하지만 제대로 현재 'ID'로 제한하는 방법을 알아낼하지 않았기 때문에이 작동하지 않았다.

그때 나는 등 '패스'= 1, '패스'= 2, 각 쿼리의 결과를 나타내는 뷰를 생성하지만로부터 최종 결과를 얻기 위해 쿼리를 조인을 사용하면 대부분의 ID에 대한 '통과'에 대한 가장 높은 값은 5입니다 보기는 내가보기의 일부가 비어 있기 때문에 / 특정 'ID'값이없는 빈 결과 집합을 받았다.

어떤 아이디어?

해결법

  1. ==============================

    1.나는 당신이 필요로하는 것을 이해한다면,이 시도 :

    나는 당신이 필요로하는 것을 이해한다면,이 시도 :

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

    또는, 당신은 모든 ID에 대해 하나 개의 행을 원하는 경우,이 :

    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
    
  2. ==============================

    2.내가 알고있는 것처럼, 각 패스에서 각 ID에 대한 평균값을합니다. 이 솔루션은

    내가 알고있는 것처럼, 각 패스에서 각 ID에 대한 평균값을합니다. 이 솔루션은

    SELECT id, pass, avg(value) FROM data_r1
    GROUP BY id, pass;
    
  3. from https://stackoverflow.com/questions/10702546/sql-query-with-avg-and-group-by by cc-by-sa and MIT license