ホームページ >データベース >mysql チュートリアル >分析関数を使用せずにMySQLで累積合計を計算する方法?

分析関数を使用せずにMySQLで累積合計を計算する方法?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-03 05:33:42563ブラウズ

How to Calculate Cumulative Sum in MySQL Without Using Analytic Functions?

SET を使用しない MySQL の累積合計

MySQL では、累積合計のような分析関数がないため、累計を計算しようとするときに課題が生じます。 。ただし、この機能をエミュレートするには 2 つのアプローチがあります。

相関サブクエリ

このアプローチでは、メイン クエリ内のサブクエリを利用して累積合計を取得します。ただし、特に複雑な結合を処理する場合は、リソースが大量に消費され、複雑になる可能性があります。

ユーザー変数

または、MySQL のユーザー変数を利用してコントロール ブレークを実行することもできます。処理。この方法では、元のクエリの結果を並べ替えて、それを外側のクエリでラップします。

外側のクエリ内:

  • 以前の値が干渉しないようにユーザー変数が初期化されます。
  • 順次行の ORDER BY 句を追加して、ラップされたクエリが実行されます。
  • 次のロジックが適用されます:

    • 現在の ID と日付の値が前の行の値と一致する場合、現在の金額を累積小計に追加します。
    • それ以外の場合は、累積小計をゼロにリセットし、それに現在の値を割り当てます。 amount.

ユーザー変数は、計算後に現在の ID と日の値で更新されます。

クエリの例

SELECT IF(@prev_id = c.id AND @prev_day = c.day,
         @cumtotal := @cumtotal + c.amount,
         @cumtotal := c.amount) AS cumulative_total,
     @prev_id  := c.id  AS `id`,
     @prev_day := c.day AS `day`,
     c.hr,
     c.amount AS `amount`
  FROM ( SELECT @prev_id  := NULL, @prev_day := NULL, @cumtotal := 0 ) i
  JOIN (

         select id, day, hr, amount from
         ( //multiple joins on multiple tables)a
         left join
         (//unions on multiple tables)b
         on a.id=b.id

         ORDER BY 1,2,3
       ) c

列の順序を変更する必要がある場合変更:

SELECT d.id, d.day, d.hr, d.amount, d.cumulative_total
FROM (
       // query from above
     ) d

このアプローチは、MySQL 8.0 より前のバージョンに適しており、一連の行の累積合計を計算するための効率的なソリューションを提供できます。

以上が分析関数を使用せずにMySQLで累積合計を計算する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。