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 :

Passer de 4 colonnes à 3 sur 2 lignes


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Passer de 4 colonnes à 3 sur 2 lignes
    Bonjour à vous,

    je découvre le langage sql pour des besoins professionnels.

    j'ai une question technique qui me permettrait peut être de simplifier ma commande sql.

    Soit une base de donnée de 4 colonnes de type : Nom | Prénom | Téléphone 1 | Téléphone 2

    Je réalise toute une sélection car je ne veux pas la liste de tous les clients et j'obtiens bien les lignes correspondantes.
    ex :
    Nom Prenom Téléphone 1 Téléphone 2
    Dupont Michel 06... 01...
    Dupond Claude null 06...
    Marie Virginie 01... null


    Mais je dois arriver à :
    Nom Prenom Téléphone
    Dupont Michel 06...
    Dupont Michel 01...
    Dupond Claude 06...
    Marie Virginie 01...
    Donc quand les gens ont 2 numéros, je voudrais que ça s'affiche sur 2 lignes.

    J'ai réussis en faisant un union du genre (en très simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Nom, Prenom, Telephone1
    FROM MaTable
    WHERE Telephone1 IS NOT NULL
    UNION
    SELECT Nom, Prenom, Telephone2
    WHERE Telephone2 IS NOT NULL
    FROM MaTable
    Dans les faits ça ajoute beaucoup de lignes de codes (j'ai pas mal de JOIN) qui font franchement doublon...

    Je voulais savoir s'il y avait plus simple...

    Merci à vous.
    Sous Kubuntu 20.04

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    La solution la plus rapide pour simplifier ta requête finale : créer une vue sur ta requête de mise en forme des numéros de téléphone.
    Si ton SGBD prend en charge les expressions de table, pas besoin de vue puisque tu peux créer la CTE dans la requête finale.
    Au passage, ton problème est l'illustration typique d'une mauvaise modélisation et des inconvénients qu'elle apporte...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Merci pour ta réponse.

    Je n'ai aucune possibilité de modifier la base de données qui est en PostrgreSql car elle est gérée par un logiciel de gestion de client (Must G5).
    Il est quelque peu difficile de s'y retrouver car elle contient plus de 300 tables avec des liens dans tous les sens mais pas tous fonctionnels (genre 1 client à un lien vers une table, mais l'autre non? Du coup il faut passer par x tables pour accéder à l'info. Et le fabriquant n'est pas très loquace...

    Donc CTE, c'est l'utilisation de WITH si j'ai bien lu, mais je n'arrive pas trop à saisir son fonctionnement.

    Pourrais tu me le faire pour mon exemple ? Ça me permettrait de décortiquer le truc pour le comprendre.

    Merci.
    Sous Kubuntu 20.04

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La solution avec UNION est la bonne (vous pouvez envisagez UNION ALL si les numéros 1 & 2 sont toujours différents).
    Pour reprendre l'idée d'al1_24, il faudrait écrire votre requête de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with cte_matable as
    (
    select <marequete avec plein de join et les numéros en ligne>
      from <mes tables>
    )
    select <mescolonnes>, numtel1
      from cte_matable
     where numtel1 is not null
     union -- all
    select <mescolonnes>, numtel2
      from cte_matable
     where numtel2 is not null;
    Ainsi vous n'écrivez les jointures qu'une seule fois.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Parfait !

    Là je comprends bien mieux

    Merci !

    PS : Ça me rassure je suis pas trop à la ramasse pour un débutant alors
    Sous Kubuntu 20.04

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

Discussions similaires

  1. Afficher le titre d'une colonne DBGrid sur deux lignes
    Par aimer_Delphi dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/02/2016, 16h58
  2. Réponses: 2
    Dernier message: 10/11/2014, 12h17
  3. Réponses: 2
    Dernier message: 21/09/2005, 12h18
  4. [VB.NET] DataGrid : titre des colonnes sur deux lignes
    Par Lahouari dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/12/2004, 14h44
  5. [VB6] Titre de colonne sur 2 lignes
    Par falbalaa dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/02/2004, 20h46

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