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 :

Problème requête pivot [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut Problème requête pivot
    Bonjour,
    j'ai une requête avec beaucoup de résultat ( d'environ une centaine de colonne au bas mot), initialement elle me retourné qu'une seul ligne par identifiant, mais en rajoutant les dernière colonne, elle me rajoute plusieurs lignes ( ce qui est logique car pour une personne, on peut avoir plusieurs résultats possible).

    Seulement on m'a "imposé" d'avoir une seul ligne, par identifiant, j'ai donc tenté une requête pivot, avec juste l'identifiant et les colonnes que j'ai rajouté, mais pareil, j'ai toujours plusieurs lignes.

    Est il possible de faier en sorte d'avoir qu'une seul ligne par identifiant, sachant qu'il y a plusieurs mode pour une personne et plusieurs qualifications?
    Un exemple tout bête avec la copie d'écran:
    123456 : au 01/01/17 (pivot.png) tous les cadres dont l'identifiant est 123456 ont un mode par internet
    au 01/01/17 tous les etams et ouvriers dont l'identifiant est 123456 on un mode papier

    Personnellement je trouve cela hautement improbable de faire cela sur une ligne, quand on à un mode différent, non?
    merci à vous

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par android59 Voir le message
    Personnellement je trouve cela hautement improbable de faire cela sur une ligne, quand on à un mode différent, non?
    Cette question ne s'adresse qu'à vos utilisateurs / métiers / PO, je ne vois pas trop ce que vous attendez du forum ici.
    Techniquement c'est possible - on peut afficher la première, la dernière, toutes les valeurs - fonctionnellement ce n'est vraiment pas à nous (ni à vous a priori) de décider.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    Bonjour,
    en fait justement c'était pour savoir comment faire car je ne sais pas trop comment faire cela, j'ai essayé avec un pivot mais sans succès :s

    En reprenant l'image pivot.png c'est possible de tout mettre sur une ligne ?

    Pour information, le but final est de réaliser un publipostage

    merci à vous !

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    J'ai pas bien compris, et sans requête c'est compliqué de trouver.
    A priori si tu ne veux qu'une seule ligne, faudrait utiliser un GROUP BY, et des SUM((DECODE(..)) ou des MAX() pour les colonnes

  5. #5
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    Autant pour moi, j'avais justement préparé une petite requete pour l'exemple :
    initialement j'ai une requête de ce style là:

    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
     
    select ta.identificant,
    nom,
    prenom,
    age,
    ...
    ...
    ....
    ...
    ....
    ...
    t4.valeur as valeur, --etam, cadre ou ouvrier
    tpro.valeur as mode2, --internet ou papier
    t2.datedebut as date_debut,
    t2.datefin as date_fin
     
    FROM personne ta
    left outer join mode1 t2 on ta.id=t2.idrefta
    left outer join mode2 tpro on  tpro.id=t2.idreft2
    left outer join qualif t4 on t4.id=t2.idreft4
    inner join ....
    inner join ....
    inner join ....
     
    where .......
    and ta.identificant ='123456'
    and..........
    and..........
    au début elle ne me retourne qu'une ligne, avec tout mes champs. Lorsque je met la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and ta.identificant in ('123456','123654','6599','565555')
    je ne dois avoir que 4 lignes or en rajoutant mes dernieres colonnes j'ai des doublons car pour une personne ( pour l'id 123456) on peut avoir plusieurs modes , donc je me suis dis c'est logique qu'il y ai plusieurs lignes , car la personne a plusieurs modes, mais on m'a imposé de n'avoir qu'une ligne par identifiant, tout en conservant mes données et c'est là où je sèche :s

    voici le code que j'ai utilise pour illustré mes images :
    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
     
    select *
    from 
    (
    select ta.identificant,
    t4.valeur as valeur, --etam, cadre ou ouvrier
    tpro.valeur as mode2, --internet ou papier
    t2.datedebut as date_debut,
    t2.datefin as date_fin
     
    FROM personne ta
    left outer join mode1 t2 on ta.id=t2.idrefta
    left outer join mode2 tpro on  tpro.id=t2.idreft2
    left outer join qualif t4 on t4.id=t2.idreft4
    where .......
    and ta.identificant in ('123456','789101112')
    and..........
    and..........
    )
    pivot (
    max(valeur) --t4.valeur donc 
    for valeur in ('ETAM','CADRE','OUVRIER')
     
    )
    order by 1
    Merci

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Faut savoir ce qu'on te demande et ce qu'il faut gérer comme cas.

    Exemple : Avec listagg, tu auras la liste des données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select ta.identificant,
    listagg(t4.valeur, ' ') within group (ORDER BY t4.valeur) as valeur, --etam, cadre ou ouvrier
    listagg(tpro.valeur, ' ') within group (ORDER BY tpro.valeur) as mode2, --internet ou papier
    MIN(t2.datedebut) as date_debut,
    MAX(t2.datefin) as date_fin
    FROM personne ta
    left outer join mode1 t2 on ta.id=t2.idrefta
    left outer join mode2 tpro on  tpro.id=t2.idreft2
    left outer join qualif t4 on t4.id=t2.idreft4
    where .......
    and ta.identificant in ('123456','789101112')
    GROUP BY ta.identifiant
    Pour les dates, je sais pas si elle sont à associer aux valeurs ou pas, mais tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listagg(t4.valeur ||'['|| to_char(t2.datedebut, 'DD.MM.RRRR') ||'-'|| to_char(t2.datefin, 'DD.MM.RRRR')||']', ' ') within group (ORDER BY t4.valeur) as valeur, --etam, cadre ou ouvrier [datedeb-datefin]

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

Discussions similaires

  1. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/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