Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1615 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Regroupement de résultats sur une seul ligne

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Regroupement de résultats sur une seul ligne

n°2045069
ximun974
Posté le 30-12-2010 à 06:41:19  profilanswer
 

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
mood
Publicité
Posté le 30-12-2010 à 06:41:19  profilanswer
 

n°2045072
Oliiii
Posté le 30-12-2010 à 07:57:01  profilanswer
 

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)

n°2045079
ximun974
Posté le 30-12-2010 à 09:40:02  profilanswer
 

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

n°2045095
ximun974
Posté le 30-12-2010 à 11:05:30  profilanswer
 

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

n°2045100
Oliiii
Posté le 30-12-2010 à 11:21:16  profilanswer
 

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
n°2045102
ximun974
Posté le 30-12-2010 à 11:33:07  profilanswer
 

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

n°2045106
ximun974
Posté le 30-12-2010 à 11:49:47  profilanswer
 

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

n°2045149
Oliiii
Posté le 30-12-2010 à 14:21:12  profilanswer
 

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

n°2045150
ximun974
Posté le 30-12-2010 à 14:27:34  profilanswer
 

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

n°2045180
Oliiii
Posté le 30-12-2010 à 16:35:46  profilanswer
 

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

mood
Publicité
Posté le 30-12-2010 à 16:35:46  profilanswer
 

n°2045188
ximun974
Posté le 30-12-2010 à 16:48:45  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Regroupement de résultats sur une seul ligne

 

Sujets relatifs
lire seconde ligne d'un fichier avec fgets en cRenvoi du numéro de ligne d'une cellule en VBA
Modifier des capsules de texte sur une image en ligneLes puces vont à la ligne
Header tout seul qui ne fonctionne pas[XSL] Filtre et regroupement selon balise
[EXCEL] Numéroter ligne Uniquement rempliesAller directement d'une ligne visible à une autre.
Copier la ligne sélectionnée dans 1 ligne vide d'une autre feuille[C#] Php hors ligne ?
Plus de sujets relatifs à : Regroupement de résultats sur une seul ligne


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR