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

SQL Oracle Discussion :

Jointure gauche union et affichage en colonne [10g]


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut Jointure gauche union et affichage en colonne
    Bonjour,
    La requête ci-dessous m'affiche deux lignes par matricule :
    DAT/MATRI/NOM/MOTIF/CODECRIT/CODEQUAL
    01/10/2018/0001/DURAND/JOUR/SAPB/CHEF
    01/10/2018/0001/DURAND/JOUR/SAPB/ADJOINT
    01/10/2018/0002/DURAND/NUIT/null/CHEF
    01/10/2018/0002/DURAND/NUIT/null/null
    ...

    Je souhaiterais faire un affichage comme ci-dessous :
    DAT/MATRI/NOM/MOTIF/CODECRIT/CODEQUAL/CODEQUAL2
    01/10/2018/0001/DURAND/JOUR/SAPB/CHEF/ADJOINT
    01/10/2018/0002/DURAND/NUIT/null/CHEF/null
    ...

    Est-ce possible de transposer ?
    Merci pour votre aide.
    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  T1.DAT as DAT,T1.MATRI AS MATRI,T2.NOMPRE AS NOM,T1.MOTIF AS MOTIF, T3.CODECRIT as CODECRIT,
    T4.CODEQUAL AS CODEQUAL
    FROM T1
    LEFT  OUTER JOIN T2 ON T1.MATRI = T2.MATRI 
    LEFT OUTER JOIN T3 ON T2 = PLPEMCRI.MATRI AND T3.CODECRIT = 'SAPB' AND T3.DATFIN = '31/12/2099'
    LEFT OUTER JOIN T4 ON T2.MATRI = T4.MATRI AND T4.CODEQUAL = 'CHEF'  AND T4.DATFIN = '31/12/2099'
    WHERE T1.MOTIF  in ('JOUR','NUIT', 'AM', 'MATIN')  AND T1.DAT >= '01/10/2018' AND T1.DAT <= '31/10/2018'
    UNION
    SELECT  T1.DAT as DAT,T1.MATRI AS MATRI,T2.NOMPRE AS NOM,T1.MOTIF AS MOTIF, T3.CODECRIT as CODECRIT,
    T4.CODEQUAL AS CODEQUAL
    FROM T1
    LEFT  OUTER JOIN T2 ON T1.MATRI = T2.MATRI 
    LEFT OUTER JOIN T3 ON T2 = PLPEMCRI.MATRI AND T3.CODECRIT = 'SAPB' AND T3.DATFIN = '31/12/2099'
    LEFT OUTER JOIN T4 ON T2.MATRI = T4.MATRI AND T4.CODEQUAL = 'ADJOINT'  AND T4.DATFIN = '31/12/2099'
    WHERE T1.MOTIF  in ('JOUR','NUIT', 'AM', 'MATIN')  AND T1.DAT >= '01/10/2018' AND T1.DAT <= '31/10/2018'

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Avec les fonctions de fenêtrage LEAD (données de la ligne suivante) et ROW_NUMBER (n° ligne de la fenêtre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT matri, nom, motif, codecrit, codequal, codequal2
    FROM (
    SELECT matri, nom, motif, codecrit, codequal, lead(codequal, 1) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal2,
    		row_number() OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) num
    FROM
    		( SELECT '0001' matri, 'DURAND' nom, 'JOUR' motif, 'SAPB' codecrit, 'CHEF' codequal FROM dual
          UNION ALL SELECT '0001', 'DURAND', 'JOUR', 'SAPB', 'ADJOINT' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', 'CHEF' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', '' FROM dual
         )
    )
    WHERE num = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MATRI	NOM	MOTIF	CODECRIT	CODEQUAL	CODEQUAL2
    0001	DURAND	JOUR	SAPB		ADJOINT		CHEF
    0002	DURAND	NUIT			CHEF
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Si je comprends bien, dans ta table T1, on a N lignes (N >= 1) pour une même personne si celle-ci occupe plusieurs postes, avec donc des données dupliquées à part le poste?
    Si oui, il aurait fallu mettre les postes occupés par la personne dans une table à part... mais bon, c'est trop tard je suppose.

    Maintenant, je laisse les pro du SQL répondre à ta question; mais je verrai bien un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT nom, prenom, CONCATENER_LES_N_RETOURS(SELECT poste from t1 where id = t1.=id)
    from t1;
    Bien sur, il faut trouver la fonction SQL pour CONCATENER_LES_N_RETOURS...
    Des pistes ici :
    https://asktom.oracle.com/pls/apex/f?p=100:11:0:::11_QUESTION_ID:5526018500346202509
    https://oracle-base.com/articles/mis...ion-techniques
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par McM Voir le message
    Bonjour,

    Avec les fonctions de fenêtrage LEAD (données de la ligne suivante) et ROW_NUMBER (n° ligne de la fenêtre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT matri, nom, motif, codecrit, codequal, codequal2
    FROM (
    SELECT matri, nom, motif, codecrit, codequal, lead(codequal, 1) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal2,
    		row_number() OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) num
    FROM
    		( SELECT '0001' matri, 'DURAND' nom, 'JOUR' motif, 'SAPB' codecrit, 'CHEF' codequal FROM dual
          UNION ALL SELECT '0001', 'DURAND', 'JOUR', 'SAPB', 'ADJOINT' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', 'CHEF' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', '' FROM dual
         )
    )
    WHERE num = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MATRI	NOM	MOTIF	CODECRIT	CODEQUAL	CODEQUAL2
    0001	DURAND	JOUR	SAPB		ADJOINT		CHEF
    0002	DURAND	NUIT			CHEF
    Le problème c'est que j'ai plusieurs matricule, donc je ne peux effectuer le union all.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par jopont Voir le message
    Le problème c'est que j'ai plusieurs matricule, donc je ne peux effectuer le union all.
    La partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ( SELECT '0001' matri, 'DURAND' nom, 'JOUR' motif, 'SAPB' codecrit, 'CHEF' codequal FROM dual
          UNION ALL SELECT '0001', 'DURAND', 'JOUR', 'SAPB', 'ADJOINT' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', 'CHEF' FROM dual
          UNION ALL SELECT '0002', 'DURAND', 'NUIT', '', '' FROM dual
         )
    c'est juste pour avoir des données, tu mets ta requête à la place, et tu rajoutes les colonnes que je n'ai pas mis.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    Il me semblait que c'était pour avoir des données.
    Donc du coup ça fonctionne hyper bien!
    Merci

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    SI je veux ajouter des colonnes, il suffit de mettre un codequal3 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT matri, nom, motif, codecrit, codequal, codequal2,codequal3
    FROM (
    SELECT matri, nom, motif, codecrit, codequal, lead(codequal, 1) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal2,
    lead(codequal, 1) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal3,
    		row_number() OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) num
    FROM

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'ai retrouvé le lien du cours sur les fonctions analytiques : https://lalystar.developpez.com/fonctionsAnalytiques/

    Si tu veux ajouter une troisième ligne, il faut alors faire un LEAD(codequal, 2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT matri, nom, motif, codecrit, codequal, codequal2,codequal3
    FROM (
    SELECT matri, nom, motif, codecrit, codequal, lead(codequal, 1) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal2,
    lead(codequal, 2) OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) codequal3,
    		row_number() OVER (PARTITION BY matri, nom, motif, codecrit ORDER BY codequal) num
    FROM
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/11/2015, 09h00
  2. [PrestaShop] Affichage des colonnes gauche/droite récupération des fichiers.
    Par Thibcal dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 03/06/2015, 11h48
  3. JOINTURE et affichage de colonne
    Par jopont dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/06/2012, 09h52
  4. Multi-requêtes en colonnes (jointure ou union)
    Par franquis dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/06/2010, 15h37
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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