Partage
  • Partager sur Facebook
  • Partager sur Twitter

Solde

solde par mois tout en gardant le solde du mois précédent

Sujet résolu
    19 avril 2017 à 16:40:41

    Bonsoir à tous. 

    je suis confronté a un soucis avec une de mes requêtes, j'aimerais avoir le solde des recettes et depenses et cela par mois tout en gardant le solde du mois précédent qui sera ajouter au mois en cours.

    voici ma requete:

    SELECT M.mvt_date, COALESCE( R.cr_ref, D.cD_ref ) AS reference, COALESCE( R.cr_motif, D.cD_motif ) AS motif, COALESCE( R.cr_montant, 0 ) AS recette, COALESCE( D.cd_montant, 0 ) AS depense, @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul FROM Mouvement M CROSS JOIN ( SELECT @cumul:=0 ) tmp LEFT JOIN entree E ON M.mvt_id = E.mvt_id LEFT JOIN carnetrecette R ON E.cr_id = R.cr_id LEFT JOIN sortie S ON M.mvt_id = S.mvt_id LEFT JOIN carnetdepense D ON S.cd_id = D.cd_id WHERE month(m.mvt_date)=month(now())

    mais quand je proccède ainsi il fait juste le solde du mois en cours sans tenir compte du mois anterieur

    puis-je sollicité votre aide SVP

    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2017 à 9:23:43

      Bonjour,

      Ta requête ne peut te sortir les montants des mois précédents puisque avec ta clause WHERE tu lui demandes seulement les mouvements du mois en cours ...

      Si tu veux disposer du solde antérieur, il faut d'abord le calculer, le stocker dans une variable puis utiliser cette variable dans ta requête pour point de départ de ton cumul ...

      Par ailleurs, attention à l'année ... si tu as des mouvements pour avril 2016, alors tu vas les avoir dans ta requête ... il faudrait rajouter une condition sur l'année en plus du mois ...

      -- Initialisation du cumul à 0
      SET @cumul := 0;
      
      -- Calcul du cumul depuis le début jusqu'au mois dernier
      SELECT SUM( COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) ) INTO @cumul
      FROM
      	Mouvement M
      		LEFT JOIN entree E
      			ON M.mvt_id = E.mvt_id
      		LEFT JOIN carnetrecette R
      			ON E.cr_id = R.cr_id
      		LEFT JOIN sortie S
      			ON M.mvt_id = S.mvt_id
      		LEFT JOIN carnetdepense D
      			ON S.cd_id = D.cd_id
      WHERE m.mvt_date < STR_TO_DATE( CONCAT( YEAR(NOW()), MONTH(NOW()), '01' ), '%Y%m%d' );
      
      -- Mouvements du mois en cours avec cumul précdent
      SELECT
      	M.mvt_date,
      	COALESCE( R.cr_ref, D.cD_ref ) AS reference,
      	COALESCE( R.cr_motif, D.cD_motif ) AS motif,
      	COALESCE( R.cr_montant, 0 ) AS recette,
      	COALESCE( D.cd_montant, 0 ) AS depense,
      	@cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
      FROM
      	Mouvement M
      		LEFT JOIN entree E
      			ON M.mvt_id = E.mvt_id
      		LEFT JOIN carnetrecette R
      			ON E.cr_id = R.cr_id
      		LEFT JOIN sortie S
      			ON M.mvt_id = S.mvt_id
      		LEFT JOIN carnetdepense D
      			ON S.cd_id = D.cd_id
      WHERE
      	YEAR(m.mvt_date)=YEAR(NOW())
      	AND MONTH(m.mvt_date)=MONTH(NOW())
      ORDER BY M.mvt_date;

      -
      Edité par Benzouye 24 avril 2017 à 13:15:18

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        24 avril 2017 à 12:25:50

        Bonjour Benzouye. Merci à toi.

        Mais quand je fais cette requête:

        SET @cumul:=0;
        SELECT M.mvt_date, COALESCE( R.cr_ref, D.cD_ref ) AS reference, COALESCE( R.cr_motif, D.cD_motif ) AS motif, COALESCE( R.cr_montant, 0 ) AS recette, COALESCE( D.cd_montant, 0 ) AS depense, @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul FROM Mouvement M LEFT JOIN entree E ON M.mvt_id = E.mvt_id LEFT JOIN carnetrecette R ON E.cr_id = R.cr_id LEFT JOIN sortie S ON M.mvt_id = S.mvt_id LEFT JOIN carnetdepense D ON S.cd_id = D.cd_id WHERE YEAR(m.mvt_date)=YEAR(NOW()) AND MONTH(m.mvt_date)=MONTH(NOW()) ORDER BY M.mvt_date

        j'ai toujours le même résultat que voici

        affichage du mois en cours

        alors que à la base quand j’exécute la requête générale sans Where:

        SELECT M.mvt_date, COALESCE( R.cr_ref, D.cD_ref ) AS reference, COALESCE( R.cr_motif, D.cD_motif ) AS motif, COALESCE( R.cr_montant, 0 ) AS recette, COALESCE( D.cd_montant, 0 ) AS depense, @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul FROM Mouvement M CROSS JOIN ( SELECT @cumul:=0 ) tmp LEFT JOIN entree E ON M.mvt_id = E.mvt_id LEFT JOIN carnetrecette R ON E.cr_id = R.cr_id LEFT JOIN sortie S ON M.mvt_id = S.mvt_id LEFT JOIN carnetdepense D ON S.cd_id = D.cd_id order by M.mvt_date ASC

        j'ai ceci

        affichage du solde de la caisse

        or ce que je veux c'est avoir le solde précédent qui sera ajouté au solde du mois en cours.

        -
        Edité par AlFaddi 24 avril 2017 à 12:29:55

        • Partager sur Facebook
        • Partager sur Twitter
          24 avril 2017 à 13:21:32

          Dans le code que je t'ai donné, il y a trois requêtes. Un SET, un SELECT ... INTO et un SELECT. Ces trois requêtes sont à exécuter à la suite dans une même session pour conserver la valeur de la variable @cumul.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            24 avril 2017 à 14:04:57

            Je m'y prend mal surement parce que voici ce que je saisi dans l’éditeur de code:

            SET @cumul := 0;
            SELECT SUM( COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) ) INTO @cumul
            FROM
                Mouvement M
                    LEFT JOIN entree E
                        ON M.mvt_id = E.mvt_id
                    LEFT JOIN carnetrecette R
                        ON E.cr_id = R.cr_id
                    LEFT JOIN sortie S
                        ON M.mvt_id = S.mvt_id
                    LEFT JOIN carnetdepense D
                        ON S.cd_id = D.cd_id
            WHERE m.mvt_date < STR_TO_DATE( CONCAT( YEAR(NOW()), MONTH(NOW()), '01' ), '%Y%m%d' );
            SELECT
                M.mvt_date,
                COALESCE( R.cr_ref, D.cD_ref ) AS reference,
                COALESCE( R.cr_motif, D.cD_motif ) AS motif,
                COALESCE( R.cr_montant, 0 ) AS recette,
                COALESCE( D.cd_montant, 0 ) AS depense,
                @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
            FROM
                Mouvement M
                    LEFT JOIN entree E
                        ON M.mvt_id = E.mvt_id
                    LEFT JOIN carnetrecette R
                        ON E.cr_id = R.cr_id
                    LEFT JOIN sortie S
                        ON M.mvt_id = S.mvt_id
                    LEFT JOIN carnetdepense D
                        ON S.cd_id = D.cd_id
            WHERE
                YEAR(m.mvt_date)=YEAR(NOW())
                AND MONTH(m.mvt_date)=MONTH(NOW())
            ORDER BY M.mvt_date;

            Mais j'obtiens "NULL" dans la colonne de cumul malgré qu'il soit déclaré a zéro au début.

            voici l'image du résultat.

            • Partager sur Facebook
            • Partager sur Twitter
              24 avril 2017 à 14:54:09

              Peux-tu rajouter un SELECT @cumul entre les SELECT pour voir :

              -- Initialisation du cumul à 0
              SET @cumul := 0;
               
              -- Calcul du cumul depuis le début jusqu'au mois dernier
              SELECT SUM( COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) ) INTO @cumul
              FROM
                  Mouvement M
                      LEFT JOIN entree E
                          ON M.mvt_id = E.mvt_id
                      LEFT JOIN carnetrecette R
                          ON E.cr_id = R.cr_id
                      LEFT JOIN sortie S
                          ON M.mvt_id = S.mvt_id
                      LEFT JOIN carnetdepense D
                          ON S.cd_id = D.cd_id
              WHERE m.mvt_date < STR_TO_DATE( CONCAT( YEAR(NOW()), MONTH(NOW()), '01' ), '%Y%m%d' );
              
              -- Affiche le cumul calculé
              SELECT @cumul;
               
              -- Mouvements du mois en cours avec cumul précdent
              SELECT
                  M.mvt_date,
                  COALESCE( R.cr_ref, D.cD_ref ) AS reference,
                  COALESCE( R.cr_motif, D.cD_motif ) AS motif,
                  COALESCE( R.cr_montant, 0 ) AS recette,
                  COALESCE( D.cd_montant, 0 ) AS depense,
                  @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
              FROM
                  Mouvement M
                      LEFT JOIN entree E
                          ON M.mvt_id = E.mvt_id
                      LEFT JOIN carnetrecette R
                          ON E.cr_id = R.cr_id
                      LEFT JOIN sortie S
                          ON M.mvt_id = S.mvt_id
                      LEFT JOIN carnetdepense D
                          ON S.cd_id = D.cd_id
              WHERE
                  YEAR(m.mvt_date)=YEAR(NOW())
                  AND MONTH(m.mvt_date)=MONTH(NOW())
              ORDER BY M.mvt_date;
              
              -- Affiche le cumul final
              SELECT @cumul;

              Quel est le résultat complet retourné par PHPMyAdmin (5 requêtes à la suite).

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                24 avril 2017 à 15:55:05

                quand je proccède ainsi:

                SET @cumul := 0;
                SELECT SUM( COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) ) INTO @cumul
                FROM
                    Mouvement M
                        LEFT JOIN entree E
                            ON M.mvt_id = E.mvt_id
                        LEFT JOIN carnetrecette R
                            ON E.cr_id = R.cr_id
                        LEFT JOIN sortie S
                            ON M.mvt_id = S.mvt_id
                        LEFT JOIN carnetdepense D
                            ON S.cd_id = D.cd_id
                WHERE m.mvt_date < STR_TO_DATE( CONCAT( YEAR(NOW()), MONTH(NOW()), '01' ), '%Y%m%d' );
                SELECT @cumul;
                SELECT
                    M.mvt_date,
                    COALESCE( R.cr_ref, D.cD_ref ) AS reference,
                    COALESCE( R.cr_motif, D.cD_motif ) AS motif,
                    COALESCE( R.cr_montant, 0 ) AS recette,
                    COALESCE( D.cd_montant, 0 ) AS depense,
                    @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
                FROM
                    Mouvement M
                        LEFT JOIN entree E
                            ON M.mvt_id = E.mvt_id
                        LEFT JOIN carnetrecette R
                            ON E.cr_id = R.cr_id
                        LEFT JOIN sortie S
                            ON M.mvt_id = S.mvt_id
                        LEFT JOIN carnetdepense D
                            ON S.cd_id = D.cd_id
                WHERE
                    YEAR(m.mvt_date)=YEAR(NOW())
                    AND MONTH(m.mvt_date)=MONTH(NOW())
                ORDER BY M.mvt_date;
                SELECT @cumul;

                j'obtient une seule  colonne @cumull qui a pour valeur null


                 et que 

                -
                Edité par AlFaddi 24 avril 2017 à 15:56:29

                • Partager sur Facebook
                • Partager sur Twitter
                  24 avril 2017 à 16:22:40

                  Cela n'est visiblement le résultat que de la dernière requête ...

                  N'as-tu pas de résultat pour les 4 précédentes ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    24 avril 2017 à 16:41:28

                    quand je saisis les 4 précédentes

                    j'obtiens ceci

                    il marque toujours null dans la colonne cumull

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 avril 2017 à 16:47:30

                      Comme si il n'exécutait que la dernière requête ... Rien d'autre au dessus ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        24 avril 2017 à 16:55:20

                        oui justement comme sil ne voyais que la dernière requête.

                        mais non rien d'autre dessus >_<

                        -
                        Edité par AlFaddi 24 avril 2017 à 16:56:40

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 avril 2017 à 17:03:55

                          je sèche ...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            24 avril 2017 à 17:12:26

                            Pour ceux qui en auront besoin. 

                            1-création d'une vue

                            create view `vue` as
                                  (select  M.mvt_id,
                                           E.cr_id                              AS Rang,
                                           date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                           M.mvt_date,
                                           R.cr_ref                             AS Reference,
                                           R.cr_motif                           AS Motif,
                                           R.cr_Montant                         AS Recette,
                                           0                                    AS Depense
                             
                                     from  carnetrecette as R
                             
                               inner join  entree        as E
                                       on  E.cr_id = R.cr_id
                             
                               inner join  mouvement     as M
                                       on  M.mvt_id = E.mvt_id
                                   having  periode = date_format(current_date,                    "%Y-%m")
                                       or  periode = date_format(current_date - interval 1 month, "%Y-%m"))
                             
                            union
                             
                                  (select  M.mvt_id,
                                           S.cd_id                              AS Rang,
                                           date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                           M.mvt_date,
                                           D.cd_ref                             AS Reference,
                                           D.cd_motif                           AS Motif,
                                           0                                    AS Recette,
                                           D.cd_Montant                         AS Depense
                             
                                     from  carnetdepense as D
                             
                               inner join  sortie        as S
                                       on  S.cd_id  = D.cd_id
                             
                               inner join  mouvement     as M
                                       on  M.mvt_id = S.mvt_id
                                   having  periode = date_format(current_date,                    "%Y-%m")
                                       or  periode = date_format(current_date - interval 1 month, "%Y-%m"))
                             
                                 order by  mvt_id, rang
                            2-execution de la requete sur la vue.
                            
                            select    mvt_date,  reference,  motif,      recette,  depense,  cumul
                                from  (  select  mvt_date,   reference,  motif,    recette,
                                                 depense,    @cum := @cum + recette - depense as cumul,
                                                 periode,    mvt_id,     rang
                             
                                           from  vue
                                     cross join  (select @cum:=0) as x
                                      ) as y
                               where  periode = date_format(current_date, "%Y-%m")
                            order by mvt_id, rang

                            2-execution de la requete

                            select    mvt_date,  reference,  motif,      recette,  depense,  cumul
                                from  (  select  mvt_date,   reference,  motif,    recette,
                                                 depense,    @cum := @cum + recette - depense as cumul,
                                                 periode,    mvt_id,     rang
                             
                                           from  vue
                                     cross join  (select @cum:=0) as x
                                      ) as y
                               where  periode = date_format(current_date, "%Y-%m")
                            order by mvt_id, rang

                            Merci à tous


                            Merci à tous.

                            -
                            Edité par AlFaddi 24 avril 2017 à 23:34:09

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Solde

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown