78

次のようなテーブルがあります。

id   count
1    100
2    50
3    10

累積_合計という新しい列を追加したいので、テーブルは次のようになります。

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

これを簡単に実行できる MySQL 更新ステートメントはありますか? これを達成するための最良の方法は何ですか?

4

9 に答える 9

112

相関クエリを使用する:


  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

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

ノート:

  • JOIN (SELECT @running_total := 0) rクロス結合であり、別のSETコマンドを必要とせずに変数を宣言できます。
  • サブクエリ/派生テーブル/インライン ビューの場合、MySQL ではテーブル エイリアスrが必要です。

警告:

  • MySQL 固有。他のデータベースには移植できません
  • ORDER BY重要です。順序がOPと一致することを保証し、より複雑な変数の使用法に大きな影響を与える可能性があります(IE:MySQLにない疑似ROW_NUMBER / RANK機能)
于 2010-04-01T21:54:33.990 に答える
94

パフォーマンスが問題になる場合は、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;

これは実行中の方法で実行中の合計を計算します:)

于 2010-04-01T22:08:26.953 に答える
26

MySQL 8.0/MariaDB は windowed をサポートしていますSUM(col) 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 │
└─────┴──────┴────────────────┘

デシベル<>フィドル

于 2018-09-11T14:49:00.110 に答える
3
UPDATE t
SET cumulative_sum = (
 SELECT SUM(x.count)
 FROM t x
 WHERE x.id <= t.id
)
于 2010-04-01T21:59:06.560 に答える
2

サンプルクエリ

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
于 2011-07-04T11:03:31.187 に答える
1

各挿入の前に合計を計算するトリガーを作成することもできます

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

私はこれをテストしていません

于 2010-04-01T22:05:01.757 に答える
1

id,count,sum(count)over(count desc による順序) を tableName からのcumulative_sum として選択します。

count 列で sum 集計関数を使用してから、over 句を使用しました。各行を個別に合計します。最初の行は 100 になります。2 番目の行は 100+50 になります。3 行目は 100+50+10 などです。したがって、基本的にすべての行はそれと前のすべての行の合計であり、最後の行はすべての行の合計です。したがって、これを見る方法は、各行は、ID がそれ自体以下の金額の合計です。

于 2019-02-22T01:32:31.720 に答える