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 :

colonnes en ligne, est-ce possible


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut colonnes en ligne, est-ce possible
    Bonjour,
    Question d'un débutant :
    Au sein d'une requète portant sur une dizaine de tables, je cherche à "convertir" des lignes en colonnes.
    Pour être plus clair, j'ai une table qui me renvoie 1 a 4 lignes pour un client donné et je cherche à avoir ces lignes renvoyées en 1 a 4 colonnes.

    Voir ci dessous :

    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
    Table CLIENT
    IDCLI	NOM
    CLI1	Azertyuiop
    CLI2	Qsdfghjklm
    CLI3	Wxcvbn
    CLI4	KGHKJGHKJ
    
    Table TRAVAIL_CLI
    IDCLI	Travail
    CLI1	T01
    CLI1	T02
    CLI2	T01
    CLI2	T03
    CLI2	T04
    CLI2	T05
    CLI3	T01
    CLI4	T05
    
    Résultat recherché
    IDCLI	NOM       	Trav1	Trav2	Trav3	Trav4
    CLI1	Azertyuiop	T01	T02	null	null
    CLI2	Qsdfghjklm	T01	T03	T04	T05
    CLI3	Wxcvbn          T01	null	null	null
    CLI4	KGHKJGHKJ	T01	T05	null	null
    Le seul résultat que j'ai réussi à obtenir ne marche que si j'ai 4 lignes dans la table TRAVAIL_CLI (CLI2 dans l'exemple ci dessus).
    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
    SELECT  CLIENT.IDCLI, CLIENT.NOM, t1.Travail as Trav1, t2.Travail as Trav2, t3.Travail as Trav3, t4.Travail as Trav4
    FROM    CLIENT
    INNER JOIN
            TRAVAIL_CLI AS t1
    INNER JOIN
            TRAVAIL_CLI AS t2
            ON  t1.IDCLI = t2.IDCLI
            AND t1.Travail < t2.Travail
    INNER JOIN
            TRAVAIL_CLI AS t3
            ON  t2.IDCLI = t3.IDCLI
            AND t2.Travail < t3.Travail
    INNER JOIN
            TRAVAIL_CLI AS t4
            ON  t3.IDCLI = t4.IDCLI
            AND t3.Travail < t4.Travail
    order by CLIENT.IDCLI
    Si quelqu'un à une solution, je suis prenneur.

    Merci d'avance
    philippe

    Version : SQL server 2000 sur Win2003 serveur

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Remplace tes INNER JOIN par des LEFT JOIN...

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci de la réponse, mais ça ne marche pas, la requête me retourne autant de lignes que de colonnes significatives (non null).

    A bientôt
    philippe

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    En effet, j'ai répondu un peu vite.
    Il faut aussi faire un MAX() sur chacune de tes colonnes Tn.Travail

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Re,
    euhh, à quel niveau est-ce que je dois mettre ce max() dans le select, dans le "left join" ? là je sèche... je dois être trop débutant.
    A bientôt
    philippe

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    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
    SELECT  cli.idcli
        ,   cli.nom
        ,   MAX(tc1.travail) AS trav1
        ,   MAX(tc2.travail) AS trav2
        ,   MAX(tc3.travail) AS trav3
        ,   MAX(tc4.travail) AS trav4
    FROM    client  AS cli
        LEFT JOIN
            travail_cli AS tc1
            ON  tc1.idcli = tc2.idcli
        LEFT JOIN
            travail_cli AS tc2
            ON  tc1.idcli = tc2.idcli
            AND tc1.travail < tc2.travail
        LEFT JOIN
            travail_cli AS tc3
            ON  tc2.idcli = tc3.idcli
            AND tc2.travail < tc3.travail
        LEFT JOIN
            travail_cli AS tc4
            ON  tc3.idcli = tc4.idcli
            AND tc3.travail < tc4.travail
    ORDER BY client.idcli

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Re bonjour,

    Ca marche toujours pas.
    J'ai dû rajouter un group by client.idcli et je récupère bien le bon nombre de lignes et le bon nombre de colonnes mais pour chaque colonne remplie, j'ai la même valeur (le max().) voir ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IDCLI	NOM       	Trav1	Trav2	Trav3	Trav4
    CLI1	Azertyuiop	T02	T02	null	null
    CLI2	Qsdfghjklm	T05	T05	T05	T05
    CLI3	Wxcvbn          T01	null	null	null
    CLI4	KGHKJGHKJ	T05	T05	null	null
    elle est pas si simple que ça ma demande, désolé pour vos méninges :-).

    A bientôt
    philippe

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Remplace les MAX par des MIN.
    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
    SELECT client.IDCLI, client.NOM,
          MIN(t1.travail) as Trav1,
          MIN(t2.travail) as Trav2,
          MIN(t3.travail) as Trav3,
          MIN(t4.travail) as Trav4
    FROM client
      LEFT JOIN travail_cli t1
        ON t1.IDCLI = client.IDCLI
      LEFT JOIN travail_cli t2
        ON t2.IDCLI = client.IDCLI AND t2.travail>t1.travail
      LEFT JOIN travail_cli t3
        ON t3.IDCLI = client.IDCLI AND t3.travail>t2.travail
      LEFT JOIN travail_cli t4
        ON t4.IDCLI = client.IDCLI AND t4.travail>t3.travail
    GROUP BY client.IDCLI
    Trav1 contient MIN(Travail).
    Trav2 contient MIN(Travail>Trav1).
    Trav3 contient MIN(Travail>Trav2).
    Trav4 contient MIN(Travail>Trav3).

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Super, ca marche, un gros MERCI à la communauté.

    A bientôt
    philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Listbox en ligne, est-ce possible ?
    Par Alexs dans le forum Silverlight
    Réponses: 1
    Dernier message: 16/10/2009, 13h17
  2. Réponses: 7
    Dernier message: 09/05/2006, 12h30
  3. Réponses: 24
    Dernier message: 08/05/2006, 17h40
  4. Réponses: 2
    Dernier message: 18/11/2005, 22h40
  5. est il possible d'inverser ligne/colonne ?
    Par kiki26 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 25/01/2005, 16h35

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