Helpex - Trao đổi & giúp đỡ Đăng nhập
74

Tôi có một bảng trông như thế này:

id   count
1    100
2    50
3    10

Tôi muốn thêm một cột mới có tên là tích lũy_sum, vì vậy bảng sẽ trông như thế này:

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

Có câu lệnh cập nhật MySQL nào có thể thực hiện việc này một cách dễ dàng không? Cách tốt nhất để thực hiện điều này là gì?

74 hữu ích 0 bình luận 119k xem chia sẻ
92

Nếu hiệu suất là một vấn đề, bạn có thể sử dụng một biến MySQL:

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

Ngoài ra, bạn có thể loại bỏ cumulative_sumcột và tính toán nó trên mỗi truy vấn:

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

Điều này tính toán tổng chạy theo một cách chạy :)

92 hữu ích 5 bình luận chia sẻ
108

Sử dụng truy vấn tương quan:


  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

Sử dụng các biến MySQL:


  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

Ghi chú:

  • Đây JOIN (SELECT @running_total := 0) rlà một phép nối chéo và cho phép khai báo biến mà không yêu cầu một SETlệnh riêng biệt .
  • Bí danh bảng r, được MySQL yêu cầu cho bất kỳ truy vấn con / bảng dẫn xuất / chế độ xem nội tuyến nào

Lưu ý:

  • MySQL cụ thể; không di động đến các cơ sở dữ liệu khác
  • Điều ORDER BYquan trọng; nó đảm bảo thứ tự khớp với OP và có thể có ý nghĩa lớn hơn đối với việc sử dụng biến phức tạp hơn (chức năng IE: psuedo ROW_NUMBER / RANK, mà MySQL thiếu)
108 hữu ích 5 bình luận chia sẻ
20

MySQL 8.0 / MariaDB hỗ trợ windowed SUM(col) OVER():

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

Đầu ra:

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

db <> fiddle

20 hữu ích 1 bình luận chia sẻ
3
UPDATE t
SET cumulative_sum = (
 SELECT SUM(x.count)
 FROM t x
 WHERE x.id <= t.id
)
3 hữu ích 1 bình luận chia sẻ
3
select Id, Count, @total := @total + Count as cumulative_sum
from YourTable, (Select @total := 0) as total ;
3 hữu ích 2 bình luận chia sẻ
2

Truy vấn mẫu

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
2 hữu ích 0 bình luận chia sẻ
1

Bạn cũng có thể tạo một trình kích hoạt sẽ tính toán tổng trước mỗi lần chèn

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

Tôi chưa thử cái này

1 hữu ích 0 bình luận chia sẻ
1

chọn id, count, sum (count) over (order by count desc) as cum Tích_sum từ tableName;

Tôi đã sử dụng hàm tổng hợp sum trên cột đếm và sau đó sử dụng mệnh đề over. Nó tổng hợp từng hàng một. Hàng đầu tiên sẽ là 100. Hàng thứ hai sẽ là 100 + 50. Hàng thứ ba là 100 + 50 + 10, v.v. Vì vậy, về cơ bản mỗi hàng là tổng của nó và tất cả các hàng trước đó và hàng cuối cùng là tổng của tất cả các hàng. Vì vậy, cách để xem điều này là mỗi hàng là tổng của số lượng ID nhỏ hơn hoặc bằng chính nó.

1 hữu ích 2 bình luận chia sẻ
0
  select t1.id, t1.count, SUM(t2.count) cumulative_sum
    from table t1 
        join table t2 on t1.id >= t2.id
    group by t1.id, t1.count

Từng bước một:

1- Cho bảng sau:

select *
from table t1 
order by t1.id;

id  | count
 1  |  11
 2  |  12   
 3  |  13

2 - Nhận thông tin theo nhóm

select *
from table t1 
    join table t2 on t1.id >= t2.id
order by t1.id, t2.id;

id  | count | id | count
 1  | 11    | 1  |  11

 2  | 12    | 1  |  11
 2  | 12    | 2  |  12

 3  | 13    | 1  |  11
 3  | 13    | 2  |  12
 3  | 13    | 3  |  13

3- Bước 3: Tính tổng tất cả theo nhóm t1.id

select t1.id, t1.count, SUM(t2.count) cumulative_sum
from table t1 
    join table t2 on t1.id >= t2.id
group by t1.id, t1.count;


id  | count | cumulative_sum
 1  |  11   |    11
 2  |  12   |    23
 3  |  13   |    36
0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ mysql sql cumulative-sum , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading