Aide pour créér une requete pour un regroupement

Aide pour créér une requete pour un regroupement - SQL/NoSQL - Programmation

Marsh Posté le 10-07-2007 à 14:17:46    

Bonjour j'ai besoin d'aide pour creer une requete.
Je m'explique :
j'ai 3 tables 1 hébergements H,et 1 options O,et intitule_options IO
dans la table des options il y a les correspondances entre les options et les hébergements et dans la 3 eme le nom des options.
Je sais qu'un hebergement peut avoir au max 6 options (il n'en existe pas plus)
Si je fait un : select * from H,O,IO WHERE h.id = o.id_H
si un hebergement possede 3 options je vais avoir 3 fois la ligne avec l'hebergement et chacune des options.
 
Je voudrais savoir si il y avait un moyen pour n'affiche qu'une seule ligne par hebergement peut etre avec des champs O1,O2,O3,O4,O5,O6 et uen valeur dedans s'il y a quelque chose ou nulle si l'hebergement n'a ps l'option... ?

Reply

Marsh Posté le 10-07-2007 à 14:17:46   

Reply

Marsh Posté le 10-07-2007 à 14:43:21    

Habituellement on traite ce genre de choses dans le langage qui récupère les résultats, pas directement en SQL. Tu as un intérêt quelconque à le faire directement en SQL? :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 10-07-2007 à 15:12:22    

mysql? si oui group_concat

Reply

Marsh Posté le 11-07-2007 à 08:27:35    

et oui c'est pour exporter sous exel .... :S et c'est une base firebird.. !
merci !


Message édité par albertos le 11-07-2007 à 08:27:51
Reply

Marsh Posté le 11-07-2007 à 12:48:31    

group_concat ça fait qu'une seule colonne non ?
 
ta table IO, elle contient combien de lignes ?
(en fait, tu dis que tu peux pas avoir plus de 6 options par appartement, parcequ'il n'y a que 6 options dans la base, ou si ça n'a rien à voir ?)
 
Dans tes 6 colonnes, tu veux regrouper les mêmes options dans les mêmes colonnes, ou si tu te moques de leur ordre ?
 
Toutes ces questions, parceque tu peux faire ça comme requête :

Code :
  1. SELECT *
  2. FROM h
  3. LEFT OUTER JOIN o1 ON o1.id_h = h.id
  4. LEFT OUTER JOIN io1 ON oi1.id = o1.o_id AND io1.id = 'OPT1'
  5. LEFT OUTER JOIN o2 ON o2.id_h = h.id
  6. LEFT OUTER JOIN io2 ON oi2.id = o2.o_id AND io2.id = 'OPT2'
  7. LEFT OUTER JOIN o3 ON o3.id_h = h.id
  8. LEFT OUTER JOIN io3 ON oi3.id = o3.o_id AND io3.id = 'OPT3'
  9. LEFT OUTER JOIN o4 ON o4.id_h = h.id
  10. LEFT OUTER JOIN io4 ON oi4.id = o4.o_id AND io4.id = 'OPT4'
  11. LEFT OUTER JOIN o5 ON o5.id_h = h.id
  12. LEFT OUTER JOIN io5 ON oi5.id = o5.o_id AND io5.id = 'OPT5'
  13. LEFT OUTER JOIN o6 ON o6.id_h = h.id
  14. LEFT OUTER JOIN io6 ON oi6.id = o6.o_id AND io6.id = 'OPT6'


 
Evidement, c'est plus chiant à écrire...

Reply

Marsh Posté le 11-07-2007 à 12:50:01    

Sinon, pour info, si c'est pour envoyer dans Excel, tu devrais faire un extract normal (ta première requête) et effectuer la mise en colonne à l'aide d'un tableau croisé dynamique.
 
Un SGBD, ça sert à gérer les informations brutes
Excel, ça sert à transformer des informations brutes afin d'en faire des informations analytiques
 
Bref, chacun son métier ;)


Message édité par MagicBuzz le 11-07-2007 à 12:50:09
Reply

Marsh Posté le 11-07-2007 à 14:50:34    

MagicBuzz a écrit :

group_concat ça fait qu'une seule colonne non ?
 
ta table IO, elle contient combien de lignes ?
(en fait, tu dis que tu peux pas avoir plus de 6 options par appartement, parcequ'il n'y a que 6 options dans la base, ou si ça n'a rien à voir ?)
 
Dans tes 6 colonnes, tu veux regrouper les mêmes options dans les mêmes colonnes, ou si tu te moques de leur ordre ?
 
Evidement, c'est plus chiant à écrire...


 
-Il n'y a que 6 options disponibles dans la base en effet, donc la table io contient 6 lignes
- a la limite je me moque de leur ordre du moment que je peux les identifier ;)
merci pour les réponses !
 
Sinon avec une procédure stockée, ou on peut mettre des IF, ce ne serait pas possible ? j'ai essayé de m'engager sur cette voie. Car il faudrait que j'arrive a automatiser la procédure de recherche que je cherche à faire ..


Message édité par albertos le 11-07-2007 à 15:18:57
Reply

Marsh Posté le 11-07-2007 à 15:45:28    

bon ben en fait j'ai réussi a faire ce que je voulais ! Merci pour l'aide en tout cas :jap:

Reply

Marsh Posté le 11-07-2007 à 16:40:06    

tu peux poster ta solution pour la pérénité du topic ? :)

Reply

Sujets relatifs:

Leave a Replay

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