[SQL]Regrouper 2 lignes dans un même champ de données

Regrouper 2 lignes dans un même champ de données [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-04-2005 à 17:29:22    

Salut,
 
Je sais pas trop comment expliquer mon probleme mais bon voilà :
J'ai par exemple un résultat comme celui-ci :
 

Code :
  1. Intitule |  Prix
  2. -------------------
  3. AA           18
  4. AA           25
  5. BCF           1
  6. BCF          40


 
 
Ce que je voudrais c'est avoir :
 

Code :
  1. Intitule |  Prix
  2. -------------------
  3. AA          18  25
  4. BCF         1   40


 
 
 
Est-ce que quelqu'un aurait une idée ... ca me parait pas etre dur mais je trouve pas quand meme et ca m'enerve  :fou:  
 
Merci par avance de votre aide  :hello:  
 
 [:alex_]


Message édité par davyd le 07-04-2005 à 17:31:58
Reply

Marsh Posté le 07-04-2005 à 17:29:22   

Reply

Marsh Posté le 08-04-2005 à 10:12:11    

Bizarre, ton truc :D
 
Va falloir deja que ton champ prix, devienne ...un varchar.
 
Et il va falloir egalement que tu fasses joujou avec un curseur :)
 
Après c'est simple, tu selectionnes par intitule, tu concatennes les prix,  
et lorsque l'intitule change, tu inscris la nouvelle ligne obtenue.
 
et on recommence...  
 
 

Reply

Marsh Posté le 08-04-2005 à 10:29:01    

Questions :
- As-tu toujours 1 OU 2 lignes de prix par produit, mais jamais plus ?
- As-tu un champ qui permet de différencier ces deux champs ?
- Quel SGBD ?

Reply

Marsh Posté le 08-04-2005 à 19:48:47    

C'est typiquement le genre de choses à faire dans le code exécutant la requête ... si le nombre de colonnes à produire n'est pas fixe, alors le SGBD ne pourra pas le gérer.

Reply

Marsh Posté le 11-04-2005 à 09:52:19    

Arjuna a écrit :

Questions :
- As-tu toujours 1 OU 2 lignes de prix par produit, mais jamais plus ?
- As-tu un champ qui permet de différencier ces deux champs ?
- Quel SGBD ?


 
 
- Oui toujours 1 ou 2 lignes de prix par produit, jamais plus
- Non je n'ai pas de champ qui permette de différencier ces 2 champs  :(  
- SQL Server

Reply

Marsh Posté le 11-04-2005 à 10:33:41    

Code :
  1. select t1.codpro, t1.prix, isnull(t2.prix, 0) prix2
  2. from table t2, table t1
  3. where t2.codpro =* t1.corpdo
  4. and t2.prix <> t1.prix


 
Ca devrait marcher.
Mais c'est crade.


Message édité par Arjuna le 11-04-2005 à 10:34:02
Reply

Marsh Posté le 11-04-2005 à 10:40:06    

Un truc comme ca :
 
Select Intitule, Prix as PrixA, Prix as PrixB
from TaTable
Where PrixA <> PrixB
group by Intitule
 
mais c'est pas top et en plus j'ai pas testé ca se trouve ca marchera meme pas (y'a meme de fortes chances pour que ca marche pas :D )

Reply

Marsh Posté le 11-04-2005 à 10:55:33    

Je vais tester tout ca !!
Merci de vos réponses  :jap:

Reply

Marsh Posté le 11-04-2005 à 12:12:56    

ToxicAvenger a écrit :

mais c'est pas top et en plus j'ai pas testé ca se trouve ca marchera meme pas (y'a meme de fortes chances pour que ca marche pas :D )


 
marchera pas, faut lier la table deux fois, sinon tu ne récupère pas "prixB". et faut une jointure externe pour que s'il n'y a qu'un seul prix, une ligne soit retournée quand même ;)

Reply

Marsh Posté le 11-04-2005 à 12:34:19    

ah oui, un left outer join alors :o

Reply

Marsh Posté le 11-04-2005 à 12:34:19   

Reply

Marsh Posté le 11-04-2005 à 15:08:21    

d'où mon =* :p ;)

Reply

Marsh Posté le 11-04-2005 à 17:57:08    

En fait la demande de mon chef a changé :  
 
Maintenant le probleme est (presque) le meme à un detail pres :  
 

Code :
  1. Intitule |  Prix  | Style
  2. ------------------------------
  3. AA           18          4
  4. AA           25          12
  5. BCF           1          4
  6. BCF          40          12


 
 
Ce que je voudrais c'est avoir :
 

Code :
  1. Intitule |  Prix 4  | Prix 12
  2. ------------------------------
  3. AA          18           25
  4. BCF         1            40


 
 
Ca me parait etre plus simple comme ca non ?


Message édité par davyd le 11-04-2005 à 17:57:29
Reply

Marsh Posté le 11-04-2005 à 20:55:48    

select t1.codpro, t1.prix "prix 4", isnull(t2.prix, 0) "prix 12"
from table t2, table t1
where t2.codpro =* t1.corpdo
and t2.type = 12
and t2.prix <> t1.prix
and t1.type = 4
 
Ceci dit, il faut qu'il y ait au moins un prix 4 pour chaque produit, sinon ça marchera pas (le 12 est facultatif par contre).
 
Et... Si demain y'a un prix "13" au lieu d'un 12, il ne sera pas affiché. Bref, vérifie bien que c'est ce qu'il veut exactement, et que ça bougera pas, sinon t'as pas d'autre choix que de le faire dans un soft à l'extérieur, ou utilise une fonction qui retourne des lignes sous forme de colonne, mais je ne crois pas que SQL Server en ait...

Reply

Marsh Posté le 12-04-2005 à 09:01:59    

Arjuna a écrit :

select t1.codpro, t1.prix "prix 4", isnull(t2.prix, 0) "prix 12"
from table t2, table t1
where t2.codpro =* t1.corpdo
and t2.type = 12
and t2.prix <> t1.prix
and t1.type = 4
 
Ceci dit, il faut qu'il y ait au moins un prix 4 pour chaque produit, sinon ça marchera pas (le 12 est facultatif par contre).
 
Et... Si demain y'a un prix "13" au lieu d'un 12, il ne sera pas affiché. Bref, vérifie bien que c'est ce qu'il veut exactement, et que ça bougera pas, sinon t'as pas d'autre choix que de le faire dans un soft à l'extérieur, ou utilise une fonction qui retourne des lignes sous forme de colonne, mais je ne crois pas que SQL Server en ait...


 
 
Merci beaucoup !!
Je vais en parler pour savoir s'il est sur que ca bougera pas  :jap:

Reply

Marsh Posté le 12-04-2005 à 18:28:17    

Arjuna a écrit :

select t1.codpro, t1.prix "prix 4", isnull(t2.prix, 0) "prix 12"
from table t2, table t1
where t2.codpro =* t1.corpdo
and t2.type = 12
and t2.prix <> t1.prix
and t1.type = 4
 
Ceci dit, il faut qu'il y ait au moins un prix 4 pour chaque produit, sinon ça marchera pas (le 12 est facultatif par contre).
 
Et... Si demain y'a un prix "13" au lieu d'un 12, il ne sera pas affiché. Bref, vérifie bien que c'est ce qu'il veut exactement, et que ça bougera pas, sinon t'as pas d'autre choix que de le faire dans un soft à l'extérieur, ou utilise une fonction qui retourne des lignes sous forme de colonne, mais je ne crois pas que SQL Server en ait...


 
J'ai fait cette requete ...
mais par contre tous les prix qui sont à "0" n'apparaissent pas dans le resultat  :pt1cable:  
 
Est-ce que vous auriez des idées ???
 
Merci  :jap:  

Reply

Marsh Posté le 12-04-2005 à 19:22:05    

Tu peux donner un jeu de résultat ?
Normalement, ça devrait marcher :??:
 
Ah, quoique... En effet, si t'as prix1 et prix 2 à la même valeur (0 ou autre), ils ne seront pas retournés !
 
Attends, je vais tenter de corriger ça :D

Reply

Marsh Posté le 12-04-2005 à 19:24:36    

Erf, pendant que mon serveur démarre, je viens de voir en effet un bug :D
 
Vire la ligne "and t2.prix <> t1.prix"
Elle ne sert plus à rien maintenant que les prix ont un type, et à priori, c'est de cette contrainte que vient le problème :)

Reply

Marsh Posté le 12-04-2005 à 19:25:47    

T'ain, il est long à démarrer :o C'est bien la peine de foutre 4000 € dans un serveur si c'est pour avoir une brouette pareil :o (bon, ok, il est vieillissant mais bon :D)
 
-- Arf, évidement, j'avais pas activé le "quick power on self test" dans le bios... Tester 8 fois de suite la totalité des 2 Go de SDRAM PC133 c'est lent, forcément :sleep:


Message édité par Arjuna le 12-04-2005 à 19:29:09
Reply

Marsh Posté le 12-04-2005 à 19:36:46    

Ca semble mieu :
 
Requêtes :

Code :
  1. select *
  2. from prix
  3. select t1.codpro, t1.prix "prix 4", isnull(t2.prix, 0) "prix 12"
  4. from prix t2, prix t1
  5. where t2.codpro =* t1.codpro
  6. and t2.typeprx = 12
  7. and t1.typeprx = 4


 
Résultats :

Code :
  1. codpro     typeprx prix                                                 
  2. ---------- ------- -----------------------------------------------------
  3. ABC        4       0.0
  4. ABC        12      0.0
  5. BCD        4       10.0
  6. BCD        12      10.0
  7. CDE        4       12.0
  8. DEF        12      20.0
  9. EFG        4       8.0
  10. EFG        12      12.0
  11. FGH        4       25.0
  12. FGH        12      10.0
  13. (10 row(s) affected)
  14. codpro     prix 4                                                prix 12                                             
  15. ---------- ----------------------------------------------------- -----------------------------------------------------
  16. ABC        0.0                                                   0.0
  17. BCD        10.0                                                  10.0
  18. CDE        12.0                                                  0.0
  19. EFG        8.0                                                   12.0
  20. FGH        25.0                                                  10.0
  21. (5 row(s) affected)


 
Seul le produit "DEF" n'est pas retourné, ce qui est logique, car il ne répond pas à la contraire "le type 4 doit forcément être renseigné".
Par contre, CDE est retourné, même en l'absence de type 12, ainsi que ABC et BCD qui ont des prix identiques entre les deux types.

Reply

Marsh Posté le 13-04-2005 à 10:06:21    

Arjuna a écrit :

Ca semble mieu :
 
...
 
Seul le produit "DEF" n'est pas retourné, ce qui est logique, car il ne répond pas à la contraire "le type 4 doit forcément être renseigné".
Par contre, CDE est retourné, même en l'absence de type 12, ainsi que ABC et BCD qui ont des prix identiques entre les deux types.


 
Merci !!
Ca a l'air de fonctionner ... manque plus que la confirmation du chef  :D  

Reply

Sujets relatifs:

Leave a Replay

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