ホームページ > データベース > mysql チュートリアル > 8.0 より前の MySQL バージョンで累計を計算するにはどうすればよいですか?

8.0 より前の MySQL バージョンで累計を計算するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-02 22:51:38
オリジナル
902 人が閲覧しました

How to Calculate Running Totals in MySQL Versions Prior to 8.0?

MySQL での行セットの累積合計の計算

セット全体の特定の列の実行中の集計を取得するというタスクに直面しています。 MySQL の行数。課題は、バージョン 8.0 より前の MySQL には組み込みの分析関数が欠如していることです。

ユーザー変数を使用したアプローチ

この状況では、ユーザー変数を使用できます。分析関数の機能をエミュレートします。これには、元のクエリを別のクエリでラップし、ORDER BY を利用して行を順次処理することが含まれます。

外側のクエリは、現在の行の id と day の値が前の行の値と一致するかどうかを確認します。その場合、現在の行の金額を追加することによって累計が更新されます。そうでない場合、累積合計はリセットされ、現在の行の金額に設定されます。

クエリの例

このアプローチを示すクエリの例を次に示します。

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
              , @subtotal := 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
ログイン後にコピー

制限事項

このアプローチは、大規模なデータセットの場合、計算負荷が高くなる可能性があることに留意してください。さらに、元のクエリの述語が複雑な場合、ソリューションの複雑さがさらに増す可能性があります。

以上が8.0 より前の MySQL バージョンで累計を計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート