Regroupement de résultats sur une seul ligne - SQL/NoSQL - Programmation
Marsh Posté le 30-12-2010 à 07:57:01
Voila 2 facons de le faire.
La premiere ne donne pas exactement ce que tu veux mais est plus propre:
Code :
|
Marsh Posté le 30-12-2010 à 09:40:02
Merci pour ta réponse, mais je n'arrive malheureusement pas à faire marcher ça sous mySql.
Pour faciliter ma jointure, j'ai rajouter à ma table un champs ID qui est unique pour le triplet : client, groupeproduit, sousgroupeproduit.
je voudrait donc que pour cet ID, il me donne le CA de la période1, et le CA de la période2 (si les 2 CA sont présent), et sinon qu'il me mette 0 dans la colonne ou le CA n'existe pas.
...mais je ne m'en sort pas mieux ...
Marsh Posté le 30-12-2010 à 11:05:30
Avec l'ajout de l'id, cette requête me renvoie tjs les lignes aillant du ca pour les 2 périodes ... mais pas celles avec un CA sur une des 2
select a.client, a.groupproduit, a.sousgroupeproduit, b.ca ca2009, a.ca ca2010
from matable a cross join matable b on a.id=b.id
where
a.periode=date_format((curdate() + interval -(1) month),'%Y%m') and
b.periode=date_format((curdate() + interval -(13) month),'%Y%m') and
order by a.nomclient, a.groupe, a.sousgroupe
A bientôt ...
Marsh Posté le 30-12-2010 à 11:21:16
C'est probablement du au fait que tu testes si a.periode="quelque chose", pour SQL "quelque chose" peut etre égale a tout sauf a null, donc il enleve automatiquement les lignes avec un null.
J'ai evité le probleme en fesant ca:
WHERE (a.Periode = 200911 OR a.Periode IS NULL)
AND (b.Periode = 201011 OR b.Periode IS NULL)
Marsh Posté le 30-12-2010 à 11:33:07
Merci beaucoup de t'occuper de moi .. je me sens moins seul dans ma galère !!!
mais ca me donne tjs le même résultat avec la requete :
select a.client, a.groupproduit, a.sousgroupeproduit, b.ca ca2009, a.ca ca2010
from matable a cross join matable b on a.id=b.id
where
(a.periode=201011 or a.periode IS NULL) and
(b.periode=200911 or b.periode IS NULL)
peut-être une modif à faire ailleur??
Marsh Posté le 30-12-2010 à 11:49:47
Je pense que ma jointure externe ne marche pas car pour la période sans CA, la ligne n'est pas avec des valeurs à 0, mais n'existe tout simplement pas dans la BdD!
Peut-être une piste avec le prédicat EXIST .. mais j'ai peur de m'égarer une fois de plus ...
Marsh Posté le 30-12-2010 à 14:21:12
Le probleme vien peut etre du CROSS JOIN, t'as essayé avec un full join?
Marsh Posté le 30-12-2010 à 14:27:34
Le pb c'est que je suis sous MySQL et que le full joint ne marche pas ...
merci encore d'être là, et n'hésite pas si t'as un truc à me faire tester
Marsh Posté le 30-12-2010 à 16:35:46
Tu peux utiliser in Right join pour avoir tout ce qui est de 2009 + 2010/Null, avec un UNION d'une autre query qui ne recupere que les 2010 seul (avec NULL dans 2009).
Marsh Posté le 30-12-2010 à 16:48:45
Merci oliiiii gt la dessus et ça marche.
En fait, il faut faire :
select a.client, a.groupproduit, a.sousgroupeproduit, b.ca ca2009, a.ca ca2010
from matable a right outer join matable b on on a.id=b.id and a.periode<>b.periode
where
(a.periode=201011 or a.periode IS NULL) and
(b.periode=200911 or b.periode IS NULL)
Union
select a.client, a.groupproduit, a.sousgroupeproduit, b.ca ca2009, a.ca ca2010
from matable b right outer join matable a on on a.id=b.id and a.periode<>b.periode
where
(a.periode=201011 or a.periode IS NULL) and
(b.periode=200911 or b.periode IS NULL)
Mais comme un pb en engendre toujours un autre, il me met des Null à la place de 0 ... et j'ai besoin de O pour mes calculs de bout de ligne.
Alors j'ai mis un COALESCE(b.ca,0) pour remplacer les NULL par 0 quand c'est le cas ... mais je ne sais pourquoi, dès que je le mets, il me duplique des lignes....
Marsh Posté le 30-12-2010 à 06:41:19
Bonjour à tous, et merci d'avance pour votre aide
J'ai le pb suivant ... qui me bloque depuis trop de temps, le mieux est de l'expliquer par un exemple.
J'ai une table qui contient les champs suivants :
Client GroupProduit SousGroupeProduit Période CA
avec par exemple les valeurs
Toto, Voiture, Freins, 201011, 134
Toto, Maison, Porte, 200911, 267
Toto, Voiture, Freins, 200911, 389
Toto, Voiture, roue, 201011, 471
Sachant qu'il n'y a que 2 périodes dans ma table (année n et année n-1), je cherche à avoir le résultat suivant au travers d'une vue
Client GroupProduit SousGroupeProduit Période1 CA1 Période2 CA2
Toto, voiture, freins, 200911, 389, 201011, 134
Toto, voiture, roue, 200911, 0,201011, 471
Toto, maison, porte, 200911, 267, 201011, 0
Toutes mes requêtes me sortent la première ligne ... mais pour avoir les 2 autres ... ben j'y arrive pas. La solution est surement dans les unions, mais je n'ai pas encore trouvé.
Si qq'un a une petite idée, c'est avec plaisir.
Merci encore.
Message édité par ximun974 le 30-12-2010 à 06:42:49