Regroupement de résultats sur une seul ligne

Regroupement de résultats sur une seul ligne - SQL/NoSQL - Programmation

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
Reply

Marsh Posté le 30-12-2010 à 06:41:19   

Reply

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 :
  1. Declare @tmpTable TABLE (Client varchar(50), GroupProduit varchar(50), SousGroupeProduit varchar(50), Periode int, CA int)
  2.  
  3. INSERT @tmpTable (Client,GroupProduit,SousGroupeProduit,Periode,CA) VALUES ('Toto', 'Voiture', 'Freins', 201011, 134 )
  4. INSERT @tmpTable (Client,GroupProduit,SousGroupeProduit,Periode,CA) VALUES ('Toto', 'Maison', 'Porte', 200911, 267 )
  5. INSERT @tmpTable (Client,GroupProduit,SousGroupeProduit,Periode,CA) VALUES ('Toto', 'Voiture', 'Freins', 200911, 389 )
  6. INSERT @tmpTable (Client,GroupProduit,SousGroupeProduit,Periode,CA) VALUES ('Toto', 'Voiture', 'roue', 201011, 471 )
  7.  
  8. SELECT Client, GroupProduit, SousGroupeProduit, ISNULL([200911],0) [200911], ISNULL([201011],0) [201011]
  9. FROM (SELECT Client,GroupProduit,SousGroupeProduit,Periode, CA
  10.         FROM @tmpTable) AS SourceTable
  11. Pivot (SUM(SourceTable.CA) FOR SourceTable.Periode IN ([200911], [201011])) AS PivotTable
  12.  
  13. SELECT ISNULL(a.Client, b.Client) Client, ISNULL(a.GroupProduit, b.GroupProduit) GroupProduit, ISNULL(a.SousGroupeProduit, b.SousGroupeProduit) SousGroupeProduit, ISNULL(a.Periode, 200911) Periode1, ISNULL(a.CA,0) CA1, ISNULL(b.Periode, 201011) Periode2, ISNULL(b.CA,0) CA2
  14. FROM @tmpTable a
  15.     Full JOIN @tmpTable b ON b.Client = a.Client AND b.GroupProduit = a.GroupProduit AND b.SousGroupeProduit = a.SousGroupeProduit AND b.Periode != a.Periode
  16. WHERE (a.Periode = 200911 OR a.Periode IS NULL)
  17.     AND (b.Periode = 201011 OR b.Periode IS NULL)

Reply

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

Reply

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

Reply

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)


Message édité par Oliiii le 30-12-2010 à 11:21:49
Reply

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

Reply

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

Reply

Marsh Posté le 30-12-2010 à 14:21:12    

Le probleme vien peut etre du CROSS JOIN, t'as essayé avec un full join?

Reply

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

Reply

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).

Reply

Marsh Posté le 30-12-2010 à 16:35:46   

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed