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 :

Horizontalisation des données dans un select


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Horizontalisation des données dans un select
    Bonjour,j'imagine que le titre n'est pas tres parlant je vais donc essayer de vous expliquer ce que je veux faire.

    Voilà donc mon tableau.

    Contrat|Nom|Facture_deb|Facture_fin
    1	|dupont|11/04/2011|10/10/2012
    1	|dupont|11/10/2012|10/04/2013
    1	|dupont|11/04/2013|10/10/2013
    1	|dupont|11/10/2013|10/04/2014
    2	|martin|19/01/2011|18/01/2012	
    2	|martin|19/01/2012|18/01/2013
    3	|perrin|08/10/2006|07/10/2007
    3	|perrin|08/10/2007|07/10/2008
    3	|perrin|08/10/2008|07/10/2009
    3	|perrin|08/10/2009|07/10/2010
    3	|perrin|08/10/2010|07/10/2011
    3	|perrin|08/10/2011|07/10/2012
    3	|perrin|08/10/2012|07/10/2013
    est-il possible via un select de récupérer les données sous ce format ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1	|dupont|11/04/2011|10/10/2012|11/10/2012|10/04/2013|11/04/2013|10/10/2013|11/10/2013|10/04/2014
    2	|martin|19/01/2011|18/01/2012|19/01/2012|18/01/2013
    3	|perrin|08/10/2006|07/10/2007|08/10/2007|07/10/2008|08/10/2008|07/10/2009|08/10/2009|07/10/2010|08/10/2010|07/10/2011|08/10/2011|07/10/2012|08/10/2012|07/10/2013

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    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 100
    Points : 28 397
    Points
    28 397
    Par défaut
    Tu cherches une requête qui retourne un nombre de colonnes variable suivant les lignes ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    en réalité les champs Facture_deb et Facture_fin seront concaténé . Le nombre de factures varie entre 1 et 6 mais les cases sans date peuvent resté vide je me dis qu'avec un left join il y a quelque chose à faire...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par Immortalis Voir le message
    Le nombre de factures varie entre 1 et 6
    Il y en a déjà sept pour perrin dans votre exemple.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    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 100
    Points : 28 397
    Points
    28 397
    Par défaut
    Si c'est uniquement pour de l'affichage, c'est du ressort du programme appelant, pas du SGBD de faire de la mise en forme.
    Sinon, il s'agit d'effectuer un PIVOT sur tes données.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Si c'est uniquement pour de l'affichage, c'est du ressort du programme appelant, pas du SGBD de faire de la mise en forme....
    Tiens, ça me rappelle des choses : http://www.developpez.net/forums/d12...avec-group-by/

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    D'accord avec les remarques précédentes (PIVOT ...).
    En v10, je peux proposer ceci :
    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
     
    select contrat
         , nom
         , max(case when r=1 then facts end) as D1
         , max(case when r=2 then facts end) as D2
         , max(case when r=3 then facts end) as D3
         , max(case when r=4 then facts end) as D4
         , max(case when r=5 then facts end) as D5
         , max(case when r=6 then facts end) as D6
    from (SELECT contrat
               , nom 
               , rank() OVER (PARTITION BY contrat, nom ORDER BY to_date(facture_deb,'DD/MM/YYYY') ) as r
               , facture_deb||'|'||facture_fin as facts
            FROM tmp
         )
    group by contrat
           , nom 
    order by contrat, nom;
    --> Attention, j'ai limité à 6 colonnes pour les couples de dates


    On peut aussi obtenir cet affichage avec la fonction LISTAGG (en v11).
    En v10, on peut contourner le problème en utilisant XMLAGG :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT contrat, nom , replace(replace(replace( XMLAGG(  XMLELEMENT("X", facture_deb||'|'||facture_fin) ORDER BY contrat, nom) ,'</X><X>', '|'), '</X>') , '<X>')  as "Dates"     
      FROM tmp
    group by contrat, nom
    1. Cela vous oblige à passer par une formatage en XML ( XMLELEMENT, qui va encadrer chaque couple de dates par les balises <X> et </X>

    2. Puis à supprimer ce formatage avec des fonctions REPLACE

    3. Le résultat est conforme à votre affichage, mais il est bien formé de trois colonnes (contrat, nom et Dates) , et non pas un nb variable de colonnes comme le ferait le PIVOT.



    Cdlt,
    OD

Discussions similaires

  1. Récupérer des données dans un SELECT sans répétition
    Par sihamnet dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 27/05/2012, 01h58
  2. Réponses: 3
    Dernier message: 23/10/2007, 15h47
  3. Ordre des données dans un select
    Par Kiroukool dans le forum SQL
    Réponses: 1
    Dernier message: 03/07/2007, 08h48
  4. Réponses: 6
    Dernier message: 17/07/2006, 15h07
  5. Récup des données d'un select (cf exemple dans la faq)
    Par j0k3r_n0ir dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/02/2005, 18h36

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