Maison  >  Questions et réponses  >  le corps du texte

Créer une colonne pour la somme cumulée dans MySQL

<p>J'ai un tableau qui ressemble à ceci :</p> <pre class="brush:php;toolbar:false;">nombre d'identifiants 1100 2 50 310≪/pré> <p>Je souhaite ajouter une nouvelle colonne appelée cumulative_sum, donc le tableau ressemble à ceci : </p> <pre class="brush:php;toolbar:false;">id count cumulative_sum 1 100 100 2 50 150 310 160≪/pré> <p>Existe-t-il une instruction de mise à jour MySQL permettant d'y parvenir facilement ? Quelle est la meilleure approche ? </p>
P粉670838735P粉670838735400 Il y a quelques jours455

répondre à tous(2)je répondrai

  • P粉245276769

    P粉2452767692023-08-23 09:47:13

    Utilisez des requêtes associées :


    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

    Utilisez des variables 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

    Remarque :

    • JOIN (SELECT @running_total := 0) r是一个交叉连接,允许在不需要单独的SETDéclarez les variables dans le contexte des commandes.
    • MySQL nécessite un alias de table pour toute sous-requête/table dérivée/vue en ligner

    Remarques :

    • Fonctionne uniquement avec MySQL, non portable vers d'autres bases de données
    • ORDER BYTrès important, cela garantit que l'ordre correspond à la question d'origine, et peut avoir un impact plus important pour une utilisation de variables plus complexe (par exemple : fonctionnalité pseudo ROW_NUMBER/RANK, non prise en charge par MySQL)

    répondre
    0
  • P粉006540600

    P粉0065406002023-08-23 00:13:27

    Si les performances posent problème, vous pouvez utiliser des variables MySQL :

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

    Vous pouvez également supprimer la colonne cumulative_sum et la calculer dans chaque requête :

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

    Cela calcule la somme cumulée de manière continue :)

    répondre
    0
  • Annulerrépondre