Faire apparaitre la colonne dans mon tableau même si sum(montant) est null [Résolu/Fermé]

Signaler
-
 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

Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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
Ca ne marche pas... dès que je mets mes conditions les mois vident disparaissent...
Messages postés
16033
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 juin 2021
867 > botitine
peux-tu montrer la requête avec les conditions?
>
Messages postés
16033
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 juin 2021

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
Messages postés
16033
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 juin 2021
867 > 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.
Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
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


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 |
Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
J'ai déplacé ta question dans le forum MySQL
Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
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

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 |
Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
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 ?
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
)
Messages postés
32969
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 559
Et des données de test seraient les bienvenus également...
Messages postés
16033
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 juin 2021
867
bonjour, comment fais-tu ces boucles?
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;
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