복붙노트

[SQL] MySQL의에서 누적 합계 열 만들기

SQL

MySQL의에서 누적 합계 열 만들기

나는 모습이 좋아하는 테이블이 있습니다 :

id   count
1    100
2    50
3    10

나는 테이블과 같을 것이다, 그래서 cumulative_sum라는 새 열을 추가하려면 :

id   count  cumulative_sum
1    100    100
2    50     150
3    10     160

쉽게 할 수있는 MySQL의 업데이트 문이 있습니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

해결법

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

    1.성능에 문제가있는 경우, 당신은 MySQL의 변수를 사용할 수 있습니다 :

    성능에 문제가있는 경우, 당신은 MySQL의 변수를 사용할 수 있습니다 :

    set @csum := 0;
    update YourTable
    set cumulative_sum = (@csum := @csum + count)
    order by id;
    

    또는, cumulative_sum 열을 제거하고 각 쿼리를 계산할 수있다 :

    set @csum := 0;
    select id, count, (@csum := @csum + count) as cumulative_sum
    from YourTable
    order by id;
    

    이것은 실행 방법으로 실행 합계를 계산합니다 :)

  2. ==============================

    2.

      SELECT t.id,
             t.count,
             (SELECT SUM(x.count)
                FROM TABLE x
               WHERE x.id <= t.id) AS cumulative_sum
        FROM TABLE t
    ORDER BY t.id
    
      SELECT t.id,
             t.count,
             @running_total := @running_total + t.count AS cumulative_sum
        FROM TABLE t
        JOIN (SELECT @running_total := 0) r
    ORDER BY t.id
    

    노트 :

    주의 사항 :

  3. ==============================

    3.MySQL은 8.0 / MariaDB가 지원 SUM을 윈도 윙 (골) OVER () :

    MySQL은 8.0 / MariaDB가 지원 SUM을 윈도 윙 (골) OVER () :

    SELECT *, SUM(cnt) OVER(ORDER BY id) AS cumulative_sum
    FROM tab;
    

    산출:

    ┌─────┬──────┬────────────────┐
    │ id  │ cnt  │ cumulative_sum │
    ├─────┼──────┼────────────────┤
    │  1  │ 100  │            100 │
    │  2  │  50  │            150 │
    │  3  │  10  │            160 │
    └─────┴──────┴────────────────┘
    

    DB <> 바이올린

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

    4.

    UPDATE t
    SET cumulative_sum = (
     SELECT SUM(x.count)
     FROM t x
     WHERE x.id <= t.id
    )
    
  5. ==============================

    5.

    select Id, Count, @total := @total + Count as cumulative_sum
    from YourTable, (Select @total := 0) as total ;
    
  6. ==============================

    6.샘플 쿼리

    샘플 쿼리

    SET @runtot:=0;
    SELECT
       q1.d,
       q1.c,
       (@runtot := @runtot + q1.c) AS rt
    FROM
       (SELECT
           DAYOFYEAR(date) AS d,
           COUNT(*) AS c
        FROM  orders
        WHERE  hasPaid > 0
        GROUP  BY d
        ORDER  BY d) AS q1
    
  7. ==============================

    7.또한 각 삽입하기 전에 합계를 계산하는 트리거를 만들 수 있습니다

    또한 각 삽입하기 전에 합계를 계산하는 트리거를 만들 수 있습니다

    delimiter |
    
    CREATE TRIGGER calCumluativeSum  BEFORE INSERT ON someTable
      FOR EACH ROW BEGIN
    
      SET cumulative_sum = (
         SELECT SUM(x.count)
            FROM someTable x
            WHERE x.id <= NEW.id
        )
    
        set  NEW.cumulative_sum = cumulative_sum;
      END;
    |
    

    나는 이것을 테스트하지 않았습니다

  8. ==============================

    8.TABLENAME에서 cumulative_sum 등 (개수별로 내림차순 순서)을 통해 ID와 카운트 합 (COUNT)를 선택;

    TABLENAME에서 cumulative_sum 등 (개수별로 내림차순 순서)을 통해 ID와 카운트 합 (COUNT)를 선택;

    나는 카운트 열 합계 집계 함수를 사용 후 이상 절을 사용했다. 그것은 개별적으로 각 행을 요약한다. 첫 번째 행은 제 행 + 50 (100) 될 것이다 (100) 될 것이다. 셋째 행은 100 + 50 + 10 등이다. 그래서 기본적으로 모든 행은 모든 이전의 행과 맨 마지막 하나의 합이 모든 행의 합이다. 이 볼 수있는 방법이 있으므로 ID 미만이거나 그 자체와 동일 여기서 각 행은 양의 합이다.

  9. from https://stackoverflow.com/questions/2563918/create-a-cumulative-sum-column-in-mysql by cc-by-sa and MIT license