IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Ligne en colonne


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut Ligne en colonne
    Bonjour

    mon experience limité du sql me pousse à venir ici

    Je voudrais avoir le résultat de ligne de requetes en colonne, apres quelques recherches j'ai trouvé comment faire.
    Par contre ca marche pas toujours, je m'explique avec un exemple :

    On a quelques tables
    PRODUIT : idProduit, nomProduit, ... (exemple vetementA, vetementB,..)
    TAILLE : idTaille, nomTaille (exemple XS, S, L, ...)
    PRODUIT_TAILLE : idProduit_Taille, idProduit, idTaille
    PRODUIT_TAILLE_PRIX : idProduit_Taille, prix (un produit peut etre plus cher pour une taille plus grande par exemple)

    Je souhaite obtenir un retour du genre:

    Produit, Prix Taille XS, Prix Taille S, Prix Taille M,.... et pour tous les produits


    Actuellement, les produits qui n existent pas dans une certaine taille n'apparaissent pas


    Cet exemple s'apparente à mon cas, mes tables concernent d'autres types mais le principe est le même

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Sans connaitre le SGBD que tu utilises il est difficle de te donner une réponse optimale.
    Toutefois, ce que tu cherches à faire se nomme un PIVOT dans le monde SQL.
    Vérifie si ton SGBD prend en charge cette instruction sinon cherche dans ce forum les messages qui y font référence, il y a toujours un moyen de résoudre ce problème.

    Quant à ta requête actuelle qui ne donne pas le résultat attendu, il est difficile de t'aider à la déboguer si tu ne la montres pas.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    Merci pour votre retour

    le soucis est que c est pas un SGBDR conventionnel, c est du windev
    On peut y faire des requêtes, ca prend en compte les instructions SQL.

    Apparemment windev ne prend pas en compte cette instruction.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Ma boule de cristal m'indique que vous avez opté pour la solution avec auto-jointures multiples.

    Faites des jointures externe, ou mieux, utiliser la méthode avec GROUP BY + CASE

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Ma boule de cristal m'indique ...
    J'ai définitivement résilié l'abonnement à ce service. Son rendement était vraiment trop faible. Beaucoup trop d'énergie dépensée pour ramer à contre-courant face à un environnement sans concessions.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    Pour mon cas

    j'ai une table

    compagnie : idCompagnie, nomCompagnie,..
    port : idPort, nomPort
    contrat: idContrat , idCompagnie (différents contrats avec une compagnie)
    voyage: idVoyage, idContrat, idPortDe, idPortA (un voyage sur un contrat d'un portDe à un portA)
    type_classe : idType_classe, nomClasse (classe éco, classe luxe,...)

    et une table voyage_type_classe: idVoyage_type_classe, idVoyage, idTypeClasse, prix


    ma requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    SELECT 
    	ent_contrat.contrat AS contrat,	
    	ent_contrat.date_debut AS date_debut,	
    	ent_contrat.date_fin AS date_fin,	
    	ent_voyage.IDcontrat AS IDcontrat,	
    	portL.nom AS pol,	
    	portD.nom AS pod,	
    	prixA.prix AS prix1,	
    	prixB.prix AS prix2
     
    FROM 
    	ent_voyage,	
    	ent_voyage_type_classe prixA,	// classe éco
    	ent_voyage_type_classe prixB,	// classe luxe
    	ent_contrat,	
    	ent_port portDe,	
    	ent_port portA
     
    WHERE 
        ent_voyage.IDvoyage = prixA.IDvoyage
    	AND 	ent_voyage.IDvoyage = prixB.IDvoyage
    	AND		ent_voyage.IDcontrat = ent_contrat.IDcontrat
    	AND		ent_voyage.IDPortDe = portD.IDport
    	AND		ent_voyage.IDPortA = portL.IDport
    	AND
    	(
    		prixA.idTypeClasse = 1  // éco
    		AND	prixB.idTypeClasse = 2  // luxe
    	)
    Quand je fige dans ma requetes les parametres typeClasse 1 et 2 (éco et luxe) , j'obtiens que les lignes de prix où il y a éco et luxe (ce qui est logique)
    Mais je peux avoir des typedeclasse que je crée entre temps pour lesquels il n'y existe pas de prix pour ces voyages
    exemple , je crée la classe : affaire

    je souhaiterais un retour du genre:

    contrat, date_debut,date_fin, PortDe, PortA, classe Eco, classeLuxe, classeAffaire, ....


    c est peut être pas possible, sql a sans doute ses limites...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Comme HyperFile ne supporte pas (à ma connaissance) le PIVOT, il est tout à fait possible de s'en sortir en construisant la requête dynamiquement.

    Il faut lister les types de classe via une première requête, et ajouter autant de colonnes dans le select et de jointures (externe !) que nécessaire.
    Mais là on sort du cadre SQL strict pour se tourner vers WinDev.

    Tatayo.

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    donc comme je disais, utilisez un group by + CASE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    SELECT 
    	ent_contrat.contrat AS contrat,	
    	ent_contrat.date_debut AS date_debut,	
    	ent_contrat.date_fin AS date_fin,	
    	ent_voyage.IDcontrat AS IDcontrat,	
    	portL.nom AS pol,	
    	portD.nom AS pod,	
    	MAX(CASE WHEN P.idTypeClasse = 1   THEN P.prix) as prix1,
    	MAX(CASE WHEN P.idTypeClasse = 2   THEN P.prix) as prix2
     
    FROM 
    	ent_voyage,	
    	ent_voyage_type_classe P,	
    	ent_contrat,	
    	ent_port portDe,	
    	ent_port portA
     
    WHERE 
        ent_voyage.IDvoyage = prixA.IDvoyage
    	AND 	ent_voyage.IDvoyage = prixB.IDvoyage
    	AND		ent_voyage.IDcontrat = ent_contrat.IDcontrat
    	AND		ent_voyage.IDPortDe = portD.IDport
    	AND		ent_voyage.IDPortA = portL.IDport
    	AND 		P.idTypeClasse IN( 1 ,2 )
    GROUP BY 
    ent_contrat.contrat ,
    	ent_contrat.date_debut ,
    	ent_contrat.date_fin ,
    	ent_voyage.IDcontrat ,
    	portL.nom,
    	portD.nom
    Je n'ai pas corrigé le reste de votre requête qui semble contenir d'autres erreurs, a commencer par l'utilisation d'alias non déclarés...

Discussions similaires

  1. [T-SQL] Convertir des lignes en colonne
    Par cortex93 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/12/2005, 16h17
  2. Supprimer toutes les lignes et colonnes d'un tableau
    Par pekka77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 11h26
  3. Tableau 5 lignes * 3 colonnes
    Par slackjayo dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 05/04/2005, 11h27
  4. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo