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 :

SQL : Création d'un tableau croisé dynamique


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut SQL : Création d'un tableau croisé dynamique
    J'aimerais directement créé un tableau croisé dynamique à partir d'une instruction SQL.

    J'ai cherché dans le documentation Oracle et voici ce que j'ai trouvé.

    Exemple de tableau dynamique que j'aimerais réalisé. Il s'agit des ventes
    par pays et par canal de ventes (internet ou vente direct).

    Channel_______France______US_______Total
    Internet______ 9,597_______124,224___133,821
    Direct Sales___ 61,202______638,201___699,403
    Total_________70,799______762,425___833,224

    Il est aisé de remplir les champs de ce tableau hors sous total et total général avec un group by.

    ORACLE fournit avec la fonction GROUP BY, les instructions ROLLUP ou CUBE qui fournisse alors les sous totaux et les totaux directement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT channels.channel_desc, countries.country_iso_code,
      TO_CHAR(SUM(amount_sold), '9,999,999,999') SALES$
    FROM sales, customers, times, channels, countries
    WHERE sales.time_id=times.time_id AND sales.cust_id=customers.cust_id AND
      sales.channel_id= channels.channel_id AND channels.channel_desc IN
      ('Direct Sales', 'Internet') AND times.calendar_month_desc='2000-09'
      AND customers.country_id=countries.country_id
      AND countries.country_iso_code IN ('US','FR')
    GROUP BY CUBE(channels.channel_desc, countries.country_iso_code);
    CHANNEL_DESC_______CO________SALES$
    ______________________________833,224
    ____________________FR________70,799
    ____________________US________762,425
    Internet_______________________133,821
    Internet_____________FR________9,597
    Internet_____________US________124,224
    Direct Sales____________________699,403
    Direct Sales__________FR________61,202
    Direct Sales__________US_______638,201

    C'est génial sauf que la plupart de mes clients ne demande pas cette mise en forme mais plutôt le premier tableau.

    D'ou ma question :
    Est-il possible via une instruction sql d'avoir directement le premier tableau sans passer par du PL/SQL.

    Plus d'info :
    http://download-uk.oracle.com/docs/c...g.htm#g1014032

    Merci d'avance.

    Ps.: Et si quelqu'un me dit comment saisir un tableau dans le forum, je suis preneur. Désolé pour les underscore mais c'est tout ce que j'ai trouvé pour aligner les champs.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    On dit aussi pivot (en anglais aussi). Voir un exemple détaillé en anglais ici: http://asktom.oracle.com/pls/ask/f?p...A:124812348063

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut Merci, réponse rapide mais ...
    Hello,

    Merci beaucoup pour cette réponse rapide qui me va droit au coeur. Je ne savais pas qu'un tableau croisé dynamqiue s'appelait pivot en anglais.

    Tom a l'air de dire qu'en SQL, il n'est pas possible de faire un pivot si on ne donne pas le nombre de colonne.

    Hors lors d'une expression GROUP BY CUBE par exemple, on ne connait pas le nombre de colonne (par exemple le nombre de pays) et pourtant il fait bien les totaux.
    Ca veut dire qu'Oracle fait une deuxième passe et je me demandais s'il n'y avait pas une commande SQL pour réaliser un pivot d'un GROUP BY CUBE.

    A aujourd'hui, je suis obligé de créer un SQL en définissant chaque colonne à la main (ou par une procédure PL/SQL) et de réaliser les totaux dans mon logiciel de reporting.

    En regardant l'expression GROUP BY CUBE, je pensais que je pouvais peut être réaliser tout cela en une seule expression SQL mais ce n'est toujours pas le cas. Quel est alors le gain de GROUP BY CUBE ?

  4. #4
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    ce n'est pas tout à fait la même chose, la fonction CUBE te fait des calculs croisés mais la restitution se fait sur un nombre de colonnes bien fixé au départ.
    Toi tu voudrais que le nombre de colonnes d'un curseur soit décidé d'aprés le resultat d'une requête ce qui me semble difficile. La notion de tableau croisé est non seulement une problématique de calcul (ce qui est résolu par les groupements, cube, max, decode etc...) mais aussi une problématique d'affichage. Pour un logiciel comme Access, ça ne pose pas de problème puisque il y a tout mélangé dans un meme programme (présentation + moteur SQL). Mais le sql-plus n'est qu'un programme de présentation trés sommaire, donc je doute que ça soit possible de tout faire avec...

  5. #5
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut Ok, ok mais je rêve d'un monde meilleur
    Merci pour toutes vos réponses, elles m'ont bien éclairé sur les limites du SQL.

    Bonne journée
    Nico

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il est important de rappeler que le SQL n'est pas sensé ce soucier des problèmes de présentations

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

Discussions similaires

  1. [AC-2007] Création d'un Tableau Croisé Dynamique (TCD) Excel depuis VBA Access
    Par Largo38 dans le forum VBA Access
    Réponses: 0
    Dernier message: 17/07/2013, 12h36
  2. Création d'un tableau croisé dynamique avec base données variable
    Par div20 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/01/2012, 23h43
  3. Réponses: 2
    Dernier message: 04/11/2010, 17h42
  4. Réponses: 4
    Dernier message: 31/07/2007, 14h34

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