IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Afficher dans un résultat un calcul portant sur les lignes précédentes.


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut Afficher dans un résultat un calcul portant sur les lignes précédentes.
    Bonjour à tous,

    Je sais, le titre n'est pas évident, mais bon

    J'ai une application gérant les membres d'une association. J'aimerais créer un graphique mettant en évidence les dates auxquelles les membres renouvellent leur cotisation ou simplement s'inscrivent. En simplifiant - parce que le cas réel met en relation plusieurs tables - disons que je recherche les dates de paiement de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT date_de_paiement, COUNT(personne_id)
      FROM  cotisations
     WHERE YEAR(date_de_paiement) > 2008
    GROUP BY date_de_paiement;
    et j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    2009-01-05 3
    2009-01-07 1
    2009-01-10 5
    etc.
    qui me montre que 3 personnes ont payé le 5 janvier.

    Ce qui m'intéresserait, c'est d'avoir pour chaque ligne la somme des personnes ayant payé ce jour, augmentée des personnes ayant payé jusque-là. Donc dans l'exemple précédent, on aurait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    2009-01-05 3 3
    2009-01-07 1 4
    2009-01-10 5 9
    etc.
    Ce genre de chose est-il possible ? Sinon, il doit y avoir moyen de traiter les résultats avec awk, mais c'est une autre histoire.

    Merci d'avance,

    Gauthier

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Essaye comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT date_de_paiement,
               COUNT(DISTINCT c1.personne_id) AS duJour,
               (SELECT COUNT(DISTINCT c2.personne_id) 
                FROM cotisations AS c2
                WHERE YEAR(c2.date_de_paiement) > 2008
                AND c2.date_de_paiement <= c1.date_de_paiement) AS cumul 
      FROM  cotisations AS c1
      WHERE YEAR(c1.date_de_paiement) > 2008
      GROUP BY c1.date_de_paiement;
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Il est vrai qu'une sous-requête, qui plus est corélée, MySQL risque de s'enrhumer.
    Essayons de faire la même avec une jointure
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c1.date_de_paiement,
               COUNT(DISTINCT c1.personne_id) AS duJour,
               COUNT(DISTINCT c2.personne_id) AS Cumul
    FROM cotisations AS c1
    LEFT JOIN cotisations AS c2
    ON YEAR(c2.date_de_paiement)=YEAR(c1.date_de_paiement)
                AND c2.date_de_paiement <= c1.date_de_paiement) 
    WHERE YEAR(c1.date_de_paiement) > 2008
    GROUP BY c1.date_de_paiement;
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Je tenterais un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SET @somme:=0;
    SELECT date_de_paiement, COUNT(personne_id), @somme:=@somme+COUNT(personne_id)
      FROM cotisations
     WHERE YEAR(date_de_paiement) > 2008
    GROUP BY date_de_paiement;
    C'est plus efficace, mais à manipuler avec précaution car les variables ne font pas forcément ce que l'on imagine.

    Cela dit, je considère que c'est bien compliqué et délicat (et non standard) pour s'économiser une simple addition dans la boucle de l'application qui traitera le résultat de la requête (même si c'est du PHP ). Et tout outil de reporting devrait aussi savoir le faire. Après, si c'est utilisé directement en shell...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut [Résolu] Afficher dans un résultat un calcul portant sur les lignes précédentes.
    Citation Envoyé par Maljuna Kris Voir le message
    Il est vrai qu'une sous-requête, qui plus est corélée, MySQL risque de s'enrhumer.
    J'ai utilisé une formule inspirée par ta première proposition. J'ignorais qu'on pouvait utiliser dans SELECT un opérateur qu'on vient de définir (ici Date_jour) - il faut bien débuter . Et ça semble marcher.

    Merci, ainsi qu'à Sivrît pour sa proposition

    Gauthier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        SELECT date AS Date_jour, COUNT(personnes.id) AS paiements,
                (SELECT COUNT(date) 
                   FROM paiements, roles, attributs
                  WHERE paiements.role_id = roles.id
                    AND roles.attribut_id = attributs.id
                    AND YEAR(roles.fin) = 2009
                    AND membre = 1
                    AND date <= Date_jour
                ) AS Somme,
                GROUP_CONCAT(CONCAT(personnes.prenom, " ", personnes.nom)) AS Personnes
           FROM paiements, roles, personnes, attributs
          WHERE paiements.role_id = roles.id
            AND roles.personne_id = personnes.id
            AND roles.attribut_id = attributs.id
            AND YEAR(roles.fin) = 2009
            AND membre = 1
          GROUP BY date
          ORDER BY date;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # Date_jour	paiements	Somme	Personnes
    2008-07-15	1	1	Ronny B****
    2008-08-31	1	2	Jean-Paul R****
    2008-09-04	1	3	Alexandre T*****
    2008-10-03	1	4	Etienne F****
    2008-10-07	1	5	Christiane L****
    2008-10-21	1	6	Françoise P****
    2008-10-27	2	8	Jean et Eva A****

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Un conseil, évite de nommer tes colonnes avec un mot réservé comme date, ou alors encapsule-le avec des ALT-GR + 7 `date`, sinon, tu risques d'avoir de mauvaises surprises.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. [XL-2007] Afficher dans zdl résultat tableau filtré
    Par AidezMoiSvp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/01/2014, 11h54
  2. Afficher le résultat d'une requête sur une ligne
    Par cmako dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/08/2008, 14h37
  3. Réponses: 3
    Dernier message: 05/08/2008, 12h49
  4. Réponses: 3
    Dernier message: 04/07/2008, 12h00
  5. affichage dans une colone de calcul fait sur les lignes
    Par godiba dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/05/2007, 08h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo