Faire apparaitre la colonne dans mon tableau même si sum(montant) est null

Résolu
botitine -  
 botitine -
Bonjour à tous,

Je profite de cette période de confinement pour me remettre à coder.

Je suis en train de faire un tableau de frais voici ma requete

SELECT IFNULL(SUM(montant_cdv),0) AS total, MONTH(date_cdv) AS mois FROM cdv  
LEFT JOIN `rcaisse` ON `rcaisse`.`id` = `cdv`.`id_caisse`
LEFT JOIN `rcomptable` ON `rcomptable`.`id` = `rcaisse`.`id_rcompt`
LEFT JOIN `gt_rcomptable` ON `gt_rcomptable`.`id_rcomptable` = `rcomptable`.`id`
LEFT JOIN `rcaisse_tab_cdv` ON `rcaisse_tab_cdv`.`rcompt` = `rcomptable`.`id`
WHERE type = :cdv
AND nom = :secteur
AND entite_cdv = :entite
GROUP BY MONTH(cdv)
ORDER BY MONTH(date) ASC


Je fais ensuite une boucle avec des <td></td>.

Le soucis est que si j'ai une depense qui n'a pas eu de montant à un mois donné, les colonnes ne décalent ce qui est logique.
J'ai créer une table mois avec la jointure
JOIN mois ON MONTH(date_cdv) = mois.id

j'ai fait des IF, des case et coalesce...
Mais ça ne marche toujours pas...

Une âme charitable pourrait-elle m'aider ?

Merci d'avance

Configuration: Windows / Firefox 75.0

11 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Petite correction
    SELECT IFNULL(SUM(montant_cdv),0) AS total
           ,seq AS mois 
    FROM 
      (
            SELECT 1 AS seq 
            UNION SELECT 2  AS seq 
            UNION SELECT 3  AS seq 
            UNION SELECT 4  AS seq 
            UNION SELECT 5  AS seq 
            UNION SELECT 6  AS seq 
            UNION SELECT 7  AS seq 
            UNION SELECT 8  AS seq 
            UNION SELECT 9  AS seq 
            UNION SELECT 10 AS seq 
            UNION SELECT 11 AS seq 
            UNION SELECT 12 AS seq 
      ) AS SEQ 
     LEFT JOIN cdv C ON SEQ.seq = MONTH(C.date_cdv)
     GROUP BY seq
    ORDER BY seq ASC
    

    1
    1. botitine
       
      Super ça marche !!! c'était du au GROUP BY et l'ORDER à ce que je vois !!
      Il ne me reste plus qu'a ajouter mes conditions.
      Un grand merci a toi
      0
    2. botitine
       
      Ca ne marche pas... dès que je mets mes conditions les mois vident disparaissent...
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > botitine
         
        peux-tu montrer la requête avec les conditions?
        0
      2. botitine > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        bien sur ^^

        SELECT IFNULL(SUM(montant_cdv),0) AS total, seq AS mois 
        						FROM 
        						  (
        								SELECT 1 AS seq 
        								UNION SELECT 2  AS seq 
        								UNION SELECT 3  AS seq 
        								UNION SELECT 4  AS seq 
        								UNION SELECT 5  AS seq 
        								UNION SELECT 6  AS seq 
        								UNION SELECT 7  AS seq 
        								UNION SELECT 8  AS seq 
        								UNION SELECT 9  AS seq 
        								UNION SELECT 10 AS seq 
        								UNION SELECT 11 AS seq 
        								UNION SELECT 12 AS seq 
        						  ) AS SEQ 
        						 LEFT JOIN cdv C ON SEQ.seq = MONTH(C.date_cdv)
        						 LEFT JOIN `rcaisse` ON `rcaisse`.`id` = C.`id_caisse`
        						 LEFT JOIN `rcomptable` ON `rcomptable`.`id` = `rcaisse`.`id_rcompt`
        						 LEFT JOIN `gt_rcomptable` ON `gt_rcomptable`.`id_rcomptable` = `rcomptable`.`id`
        						 LEFT JOIN `rcaisse_tab_cdv` ON `rcaisse_tab_cdv`.`rcompt` = `rcomptable`.`id`
        						WHERE type_cdv = :cdv
        						AND nom = :secteur
        						AND entite_cdv = :entite
        						GROUP BY seq 
        						ORDER BY seq ASC
        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > botitine
         
        je pense qu'il suffit de déplacer les conditions dans les clauses ON, en fonction des tables dans lesquelles se trouvent les champs.
        0
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Bonjour,

    et comme ça ?
    SELECT SAQ.seq
          ,T.total
    FROM 
      (
        SELECT 1 AS seq 
        UNION SELECT 2  AS seq 
        UNION SELECT 3  AS seq 
        UNION SELECT 4  AS seq 
        UNION SELECT 5  AS seq 
        UNION SELECT 6  AS seq 
        UNION SELECT 7  AS seq 
        UNION SELECT 8  AS seq 
        UNION SELECT 9  AS seq 
        UNION SELECT 10 AS seq 
        UNION SELECT 11 AS seq 
        UNION SELECT 12 AS seq 
      ) AS SEQ 
    LEFT JOIN (
       SELECT IFNULL(SUM(montant_cdv),0) AS total, MONTH(C.date_cdv) AS mois 
       FROM cdv C 
         LEFT JOIN `rcaisse` ON `rcaisse`.`id` = C.`id_caisse`
         LEFT JOIN `rcomptable` ON `rcomptable`.`id` = `rcaisse`.`id_rcompt`
         LEFT JOIN `gt_rcomptable` ON `gt_rcomptable`.`id_rcomptable` = `rcomptable`.`id`
         LEFT JOIN `rcaisse_tab_cdv` ON `rcaisse_tab_cdv`.`rcompt` = `rcomptable`.`id`
        WHERE type_cdv = :cdv
        AND nom = :secteur
        AND entite_cdv = :entite
        GROUP BY MONTH(C.date_cdv)
    ) T ON SEQ.seq = T.mois
    
     ORDER BY seq ASC
    

    1
  3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Bonjour,

    Tu bosses sur sqlServer tu es sûr ?

    pas plutôt sur mysql ?

    Ensuite, ton souci se situe au niveau de la requête ou bien au niveau de ton code ( php ? )

    Qu'obtiens tu ?
    Que veux tu obtenir ?

    NB: A l'avenir, merci de préciser le LANGAGE dans les balises de code afin d'avoir la coloration syntaxique et l'indentation.
    Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    0
  4. botitine
     
    Bonjour,

    Merci de ta réponse.

    Oui c'est du mysql. je n'ai pas trouvé le forum adéquat et je n'ai pas voulu mettre dans "php"...

    Désolé pour mon erreur.

    J’obtiens un tableau dans ce style :

    | janvier | Février | Mars |
    | 12 | 23 |

    Si Janvier est vide, Février se met sous Janvier

    J'aimerai avoir

    | janvier | Février | Mars |
    | 0 | 12 | 23 |
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
       
      J'ai déplacé ta question dans le forum MySQL
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Essaye un truc du genre
    SELECT IFNULL(SUM(montant_cdv),0) AS total
           ,MONTH(date_cdv) AS mois 
    FROM 
      (
            SELECT 1 AS seq 
            UNION SELECT 2  AS seq 
            UNION SELECT 3  AS seq 
            UNION SELECT 4  AS seq 
            UNION SELECT 5  AS seq 
            UNION SELECT 6  AS seq 
            UNION SELECT 7  AS seq 
            UNION SELECT 8  AS seq 
            UNION SELECT 9  AS seq 
            UNION SELECT 10 AS seq 
            UNION SELECT 11 AS seq 
            UNION SELECT 12 AS seq 
      ) AS SEQ 
     LEFT JOIN cdv C ON SEQ.seq = MONTH(C.date_cdv)
     LEFT JOIN `rcaisse` ON `rcaisse`.`id` = C.`id_caisse`
     LEFT JOIN `rcomptable` ON `rcomptable`.`id` = `rcaisse`.`id_rcompt`
     LEFT JOIN `gt_rcomptable` ON `gt_rcomptable`.`id_rcomptable` = `rcomptable`.`id`
     LEFT JOIN `rcaisse_tab_cdv` ON `rcaisse_tab_cdv`.`rcompt` = `rcomptable`.`id`
    WHERE type = :cdv
      AND nom = :secteur
      AND entite_cdv = :entite
    GROUP BY MONTH(C.date_cdv)
    ORDER BY MONTH(C.date_cdv) ASC
    

    0
  7. botitine
     
    Merci pour ta réponse ;).

    J'ai malheureusement déjà essayer la sous requête fixe avec les union mais ça ne marche pas :'(

    J'ai le même résultat

    | janvier | Février | Mars |
    | 12 | 23 |
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
       
      As-tu tester ta requête directement dans ta base de données (via phpMyAdmin) ?
      Qu'est-ce qu'elle t'affiche ?

      peux-tu nous fournir un dump de ta table ?
      0
  8. botitine
     
    Oui j'ai testé sur via phpMyAdmin

    le resultat :

    total mois
    22.44 3
    0.79 4

    il n'y a pas le mois 2 à 0

    ma table

    -- Structure de la table `cdv`

    CREATE TABLE `cdv` (
      `id_cdv` int(11) NOT NULL,
      `type_cdv` int(11) NOT NULL,
      `date_cdv` date NOT NULL,
      `montant_cdv` decimal(20,2) NOT NULL,
      `id_caisse` int(11) NOT NULL,
      `entite_cdv` int(11) NOT NULL
    )
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
       
      Et des données de test seraient les bienvenus également...
      0
  9. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, comment fais-tu ces boucles?
    0
  10. botitine
     
    Bonsoir,
    avec du PHP un foreach : j'appelle le total selon mes conditions

    
    // Boucle des montants
    			$gt ="";
    			foreach ($nbr as $totalgt) {
    				$gt .= "<td>".$totalgt['total']."</td>";
    			
    			}
    			return $gt;
    
    0
  11. botitine
     
    Super merci Jordane45 cette fois c'est la bonne !!

    Je n'aurais jamais trouvé tout seul...

    Je vais me replonger dans les requêtes.

    Encore merci.

    PS je passe en résolu ce soir n' étant pas sur le même PC qu'hier je n'ai pas résolu
    0