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 :

Requête croisée (pivot) sans connaître le nombre de champs..


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut Requête croisée (pivot) sans connaître le nombre de champs..
    Bonjour à tous

    je possède une table T1 définie comme ceci :
    C1 (Number(5))
    C2 (Varchar2(40))

    C1 contient des nombres sur 5 chiffres maximum, et C2 des chaînes de longueurs variables.

    Je souhaiterai obtenir un tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    C1    chaîne1C2    chaîne2C2    châine3C2    châine4C2 ....
    1      12              345          6473          3
    2       483            3             24332        980
    ...
    54352   2243          43            6            7326
    L'idée est donc de compter le nombre de champs de la table ayant pour chaîne la chaîneX (de C2), et regroupés par les nombres différents de C1.

    Le soucis c'est que je ne connais pas toutes les chaînes de C2 (enfin si, mais il y en a une centaine...). J'aurais donc pu faire ceci (cf code ci-dessous), mais ça serait trop long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT C1,
    count(CASE WHEN C2='chaine1' THEN 1 END),
    count(CASE WHEN C2='chaine2' THEN 1 END),
     
    ...
    count(CASE WHEN C2='chaine100' THEN 1 END),
    FROM T1
    GROUP BY C1 ORDER BY C1;
    Une idée? Merci à tous

  2. #2
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    Suivant ta version d'oracle, tu as la fonction PIVOT => a partir de la 11g je crois
    Delphine35
    « N’attribuez jamais à la malveillance ce qui s’explique très bien par l’incompétence. » - Napoléon Bonaparte

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Oups, j'ai oublié de préciser ma version d'Oracle... la 10g
    Je vais voir si je trouve pas quelque chose ... il faut apparemment que je fasse un pivot dynamique, ce qui impliquerai peut-être du PL/SQL
    Parce que je peut toujours faire la requête de 100 lignes, mais ça serait pas très très propre...

    edit : merci pour ton aide delphine35

  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
    Que ce soit avec la fonction PIVOT ou sans, si vous ne connaissez pas à l'avance le nombre de colonnes, il faut forcément construire la requête de façon dynamique avec du PL/SQL.

    C'est vrai dans tous les SGBD, c'est pour ça que cette opération se fait le plus souvent avec une application cliente.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Que ce soit avec la fonction PIVOT ou sans, si vous ne connaissez pas à l'avance le nombre de colonnes, il faut forcément construire la requête de façon dynamique avec du PL/SQL.

    C'est vrai dans tous les SGBD, c'est pour ça que cette opération se fait le plus souvent avec une application cliente.
    Je m'en doutais Par contre juste une chose : serait-il possible d'avoir une indication sur la marche à suivre ? Car lorsqu'on dit "dynamique", cela se passe comment ? L'idée va être de récupérer dans un premier temps tous les éléments distincts que l'on cherche (donc ici C2), puis de créer notre requête en lisant ces éléments les uns après les autres ? Merci

  6. #6
    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
    Oui c'est exactement ça !
    Il faut construire une chaîne en concaténant vos valeurs aux bons endroits, puis faire un execute immediate de cette chaîne.

    Vous pouvez le faire dans une procédure stockée.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Oui c'est exactement ça !
    Il faut construire une chaîne en concaténant vos valeurs aux bons endroits, puis faire un execute immediate de cette chaîne.

    Vous pouvez le faire dans une procédure stockée.
    Merci beaucoup, je vais voir ce que je trouve là-dessus J'étais justement en train de lire quelque chose sur l'execute immediate ici même http://sheikyerbouti.developpez.com/execute_immediate/
    Je ne place pas ce sujet en résolu, étant donné que je n'ai pas encore fait ce que je voulais (mais ça ne devrait plus tarder maintenant)

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il y a un exemple sur AskTom.

Discussions similaires

  1. Faire une somme sans connaître le nombre d'onglets et leur nom
    Par Aurianelm dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/02/2014, 15h29
  2. Réponses: 9
    Dernier message: 09/05/2009, 17h34
  3. Réponses: 1
    Dernier message: 25/04/2009, 11h31
  4. [MySQL] Mise à jour sans connaitre le nombre de champs
    Par godjojo dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/06/2008, 10h58
  5. requête croisée avec 2 champs dans le pivot??
    Par kamalkam dans le forum Access
    Réponses: 3
    Dernier message: 31/05/2006, 15h08

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