Maison >base de données >tutoriel mysql >Comment calculer la somme cumulée dans MySQL sans utiliser de fonctions analytiques ?

Comment calculer la somme cumulée dans MySQL sans utiliser de fonctions analytiques ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-03 05:33:42563parcourir

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

Somme cumulée dans MySQL sans SET

Dans MySQL, l'absence de fonctions analytiques telles que la somme cumulée présente un défi lorsque l'on tente de calculer des totaux cumulés . Cependant, il existe deux approches pour émuler cette fonctionnalité.

Sous-requêtes corrélées

Cette approche utilise une sous-requête dans la requête principale pour obtenir la somme cumulée. Cependant, cela peut être complexe et gourmand en ressources, en particulier lorsqu'il s'agit de jointures compliquées.

Variables utilisateur

Alternativement, les variables utilisateur de MySQL peuvent être exploitées pour effectuer une rupture de contrôle traitement. Cette méthode consiste à trier les résultats de la requête d'origine et à les envelopper dans une requête externe.

Dans la requête externe :

  • Les variables utilisateur sont initialisées pour garantir qu'aucune valeur précédente n'interfère.
  • La requête encapsulée est exécutée, avec l'ajout d'une clause ORDER BY pour le traitement séquentiel des lignes.
  • La logique suivante est appliqué :

    • Si les valeurs actuelles de l'identifiant et du jour correspondent à celles de la ligne précédente, ajoutez le montant actuel au sous-total cumulé.
    • Sinon, réinitialisez le sous-total cumulé à zéro et attribuez c'est le montant actuel.

Les variables utilisateur sont mises à jour avec les valeurs actuelles de l'identifiant et du jour après le calcul.

Exemple de requête

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

Si l'ordre des colonnes doit être modifié :

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

Cette approche convient aux versions de MySQL antérieure à 8.0 et peut fournir une solution efficace pour calculer les sommes cumulées sur un ensemble de lignes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn