복붙노트

[SQL] 여러 열 평균

SQL

여러 열 평균

나는 테이블이라고 요청 및 데이터 모습 등이 있습니다 :

Req_ID    R1   R2   R3   R4   R5

R12673    2    5    3    7    10
R34721    3    5    2    1    8
R27835    1    3    8    5    6

지금은 R1, R2, R3, R4 및 R5의 평균을 표시 할

그래서 쿼리를 같이 썼다 :

Select Req_ID, Avg(R1+R2+R3+R4+R5) as Average
from Request
Group by Req_ID

하지만 난 그냥 R1, R2, R3, R4 및 R5하지 평균의 합을 얻을? 어디에서 잘못을하고있는 중이 야.

해결법

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

    1.데이터를 INT로 저장되어있는 경우, 당신은 시도 할 수 있습니다

    데이터를 INT로 저장되어있는 경우, 당신은 시도 할 수 있습니다

    Average = (R1 + R2 + R3 + R4 + R5) / 5.0
    
  2. ==============================

    2.열이 널이 있다면 당신은 언급하지 않습니다. 그들은이고, 당신은 AVG 집계는 당신이 할 수 제공 (2008)와 동일한 의미를 원한다면

    열이 널이 있다면 당신은 언급하지 않습니다. 그들은이고, 당신은 AVG 집계는 당신이 할 수 제공 (2008)와 동일한 의미를 원한다면

    SELECT *,
           (SELECT AVG(c)
            FROM   (VALUES(R1),
                          (R2),
                          (R3),
                          (R4),
                          (R5)) T (c)) AS [Average]
    FROM   Request  
    

    2005 버전은 좀 더 지루

    SELECT *,
           (SELECT AVG(c)
            FROM   (SELECT R1
                    UNION ALL
                    SELECT R2
                    UNION ALL
                    SELECT R3
                    UNION ALL
                    SELECT R4
                    UNION ALL
                    SELECT R5) T (c)) AS [Average]
    FROM   Request
    
  3. ==============================

    3.당신은 간단하게 할 수있는 :

    당신은 간단하게 할 수있는 :

    Select Req_ID, (avg(R1)+avg(R2)+avg(R3)+avg(R4)+avg(R5))/5 as Average
    from Request
    Group by Req_ID
    

    권리?

    난 당신이 같은 Req_ID 여러 행이있을 수 있음을 가정하고 있는데이 경우에 동일한 Req_ID에 해당 행에 대한 모든 열과 행에 걸쳐 평균을 계산하려면

  4. ==============================

    4.PostgreSQL의에서, 단지 평균이라는 일곱 개 함수의 집합을 정의하는 하나의 행의 열 (8 2) 복수의 평균을 얻기 위해 (). null 이외의 컬럼의 평균을 생성합니다.

    PostgreSQL의에서, 단지 평균이라는 일곱 개 함수의 집합을 정의하는 하나의 행의 열 (8 2) 복수의 평균을 얻기 위해 (). null 이외의 컬럼의 평균을 생성합니다.

    그리고 단지

    select *,(r1+r2+r3+r4+r5)/5.0,average(r1,r2,r3,r4,r5) from request;
     req_id | r1 | r2 | r3 | r4 | r5 |      ?column?      |      average
    --------+----+----+----+----+----+--------------------+--------------------
     R12673 |  2 |  5 |  3 |  7 | 10 | 5.4000000000000000 | 5.4000000000000000
     R34721 |  3 |  5 |  2 |  1 |  8 | 3.8000000000000000 | 3.8000000000000000
     R27835 |  1 |  3 |  8 |  5 |  6 | 4.6000000000000000 | 4.6000000000000000
    (3 rows)
    
    update request set r4=NULL where req_id='R34721';
    UPDATE 1
    
    select *,(r1+r2+r3+r4+r5)/5.0,average(r1,r2,r3,r4,r5) from request;
     req_id | r1 | r2 | r3 | r4 | r5 |      ?column?      |      average
    --------+----+----+----+----+----+--------------------+--------------------
     R12673 |  2 |  5 |  3 |  7 | 10 | 5.4000000000000000 | 5.4000000000000000
     R34721 |  3 |  5 |  2 |    |  8 |                    | 4.5000000000000000
     R27835 |  1 |  3 |  8 |  5 |  6 | 4.6000000000000000 | 4.6000000000000000
    (3 rows)
    
    select *,(r3+r4+r5)/3.0,average(r3,r4,r5) from request;
     req_id | r1 | r2 | r3 | r4 | r5 |      ?column?      |      average
    --------+----+----+----+----+----+--------------------+--------------------
     R12673 |  2 |  5 |  3 |  7 | 10 | 6.6666666666666667 | 6.6666666666666667
     R34721 |  3 |  5 |  2 |    |  8 |                    | 5.0000000000000000
     R27835 |  1 |  3 |  8 |  5 |  6 | 6.3333333333333333 | 6.3333333333333333
    (3 rows)
    

    이 같이 :

    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC,
    V4 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        IF V4 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V4; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC,
    V4 NUMERIC,
    V5 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        IF V4 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V4; END IF;
        IF V5 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V5; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC,
    V4 NUMERIC,
    V5 NUMERIC,
    V6 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        IF V4 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V4; END IF;
        IF V5 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V5; END IF;
        IF V6 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V6; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC,
    V4 NUMERIC,
    V5 NUMERIC,
    V6 NUMERIC,
    V7 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        IF V4 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V4; END IF;
        IF V5 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V5; END IF;
        IF V6 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V6; END IF;
        IF V7 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V7; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
    CREATE OR REPLACE FUNCTION AVERAGE (
    V1 NUMERIC,
    V2 NUMERIC,
    V3 NUMERIC,
    V4 NUMERIC,
    V5 NUMERIC,
    V6 NUMERIC,
    V7 NUMERIC,
    V8 NUMERIC)
    RETURNS NUMERIC
    AS $FUNCTION$
    DECLARE
        COUNT NUMERIC;
        TOTAL NUMERIC;
    BEGIN
        COUNT=0;
        TOTAL=0;
        IF V1 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V1; END IF;
        IF V2 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V2; END IF;
        IF V3 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V3; END IF;
        IF V4 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V4; END IF;
        IF V5 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V5; END IF;
        IF V6 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V6; END IF;
        IF V7 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V7; END IF;
        IF V8 IS NOT NULL THEN COUNT=COUNT+1; TOTAL=TOTAL+V8; END IF;
        RETURN TOTAL/COUNT;
        EXCEPTION WHEN DIVISION_BY_ZERO THEN RETURN NULL;
    END
    $FUNCTION$ LANGUAGE PLPGSQL;
    
  5. ==============================

    5.

    Select Req_ID, sum(R1+R2+R3+R4+R5)/5 as Average
    from Request
    Group by Req_ID;
    
  6. from https://stackoverflow.com/questions/7367750/average-of-multiple-columns by cc-by-sa and MIT license