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

Deski Discussion :

Fonctions analytiques Oracle dans des indicateurs BO


Sujet :

Deski

  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut Fonctions analytiques Oracle dans des indicateurs BO
    Bonjour,

    Je commence à me mettre aux fonctions analytiques, avec pour but de les utiliser pour certains calculer indicateurs d'un univers BO.

    Mon premier essai a été assez décevant, tout était OK avec Toad, mais ensuite j'ai construit un indicateur du genre SUM(montant * RATIO_TO_REPORT(...) OVER(...)), et Oracle m'a envoyé un message très frustrant du genre "les fonctions de fenêtrage sont interdites ici".

    J'imagine que je devrais sortir mon RATIO_TO_REPORT du SUM et l'utiliser comme fonction d'agrégation, mais je n'ai pas encore testé.

    Plus largement, certains d'entre vous ont-ils déjà utilisé les fonctions analytiques dans un univers BO ? avez-vous plus d'expérience sur leur comportement face à un GROUP BY ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Je n'ai pas utilisé dans un univers BO mais comme tu l'as remarqué les fonctions analytiques sont uniquement utilisables dans la liste de la clause SELECT. Donc même avec GROUP BY, il est impossible d'agréger sur une fonction analytique.

    Maintenant, la fonction analytique est utilisable avec GROUP BY si toute colonne référencée dans la fonction analytique apparaît également dans la clause GROUP BY. Mais le sens n'est peut-être pas ce que tu cherche! A titre d'exemple la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(c) over()
    from t
    group by c
    doit être comprise comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select sum(c) over()
    from
    (
      select c
      from t
      group by c
    )
    Exemple avec l'agrégat COUNT()

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    select job, count(*)
    from emp
    group by job
     
    JOB       COUNT(*)               
    --------- ---------------------- 
    CLERK     4                      
    SALESMAN  4                      
    PRESIDENT 1                      
    MANAGER   3                      
    ANALYST   2                      
     
    5 rows selected
     
    select job, count(*) over()
    from emp
    group by job
     
    JOB       COUNT(*)OVER()         
    --------- ---------------------- 
    ANALYST   5                      
    CLERK     5                      
    MANAGER   5                      
    PRESIDENT 5                      
    SALESMAN  5                      
     
    5 rows selected
     
    select job, count(*) over()
    from
    (
      select job
      from emp
      group by job
    )
     
    JOB       COUNT(*)OVER()         
    --------- ---------------------- 
    ANALYST   5                      
    CLERK     5                      
    MANAGER   5                      
    PRESIDENT 5                      
    SALESMAN  5                      
     
    5 rows selected
    Consultant et formateur Oracle

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    quel est le code d'erreur exact et quel est ton sql complet ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Le message d'erreur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-30483: window functions are not allowed here
    Le SQL de mon indicateur est qqch comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(montant * RATIO_TO_REPORT(montant) OVER (personne, projet) * taux_de_conversion)
    Mais en fait le problème n'est pas là. C'est un indicateur BO, donc il doit pouvoir être utilisé tel quel avec un GROUP BY inconnu à l'avance. D'après les exemples de Michel, la fonction analytique ne respecte pas les limites du GROUP BY, mais seulement son OVER. Or, je n'ai aucun moyen de modifier dynamiquement ce code pour qu'il reflète le GROUP BY.

    J'en déduis que les fonctions analytiques sont inutilisables dans BO, à moins de passer par des vues ou des "tables dérivées" qui réduisent leur intérêt...

    Je me déplace dans le forum BO, histoire de voir si quelqu'un a une expérience à ajouter...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bonjour, Antoun, Michel et Marc ...

    Suis super content de voir des passionnés de SQL Oracle sur le forum BO, c'est pas si fréquent, et pourtant... une grosse part de la richesse de l'outil se détermine bien là dans Designer.

    Au sujet de l'emploi des fonctions analytiques et du Group by permanent de BO j'aurais deux remarques à formuler.

    Les fonctions analytiques dans le select de l'objet ne peuvent être que refusées car BO serait bien en peine d'imbriquer (ou plutôt fédérer) des termes de select aussi disparates que ceux que l'utilisateur peut générer par son choix d'objets.

    Le group by automatique dans BO peut s'éviter si besoin est en annulant dans la définition des objets la sommation par défaut en cas d'agrégation.

    Enfin, je n'ai pas testé les fonctions analytiques dans Designer (mon parti pris étant d'appuyer mes univers sur des tables infocentre précalculées selon des axes d'agrégations précis où l'emploi des fonctions analytiques se situe dans mon PL/SQL de traitement et pas dans l'univers).

    Pour autant, cela vaudrait peut être la peine d'employer ces fonctions analytiques non pas dans le select de l'objet mais dans une Table Dérivée (à partir de la V6). Ce qui fait que, pour reprendre l'exemple de Michel,on peut imaginer (je n'ai pas testé) obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Select TableDérivée.departement, TableDérivée.JOB, TableDérivée.NB
    FROM 
    (SELECT departement, job, count(*) over() as NB
    FROM emp
    GROUP BY departement, job) TableDérivée;
     
    puis le cas échéant dans la requête BO
     
    Select TableDérivée.departement, Sum(TableDérivée.NB)
    FROM 
    (SELECT departement, job, count(*) over(...) as NB
    FROM emp
    GROUP BY departement, job) TableDérivée
    GROUP BY TableDérivée.departement;
    A tester ....
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

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

Discussions similaires

  1. Fonction analytique Oracle
    Par sebastien00 dans le forum SQL
    Réponses: 3
    Dernier message: 23/03/2010, 10h52
  2. Fonction Analytique Oracle
    Par cadabricadabra dans le forum SQL
    Réponses: 2
    Dernier message: 12/12/2008, 15h11
  3. Fonctions analytiques dans des indicateurs BO
    Par Antoun dans le forum SQL
    Réponses: 3
    Dernier message: 29/01/2008, 02h13
  4. utilisation fonction stockée ORACLE dans crystal report
    Par gg2vig dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 20/09/2007, 12h23
  5. fonction équivalente à la fonction MOD (oracle) dans ms-sql
    Par rodrigue50 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/07/2005, 16h14

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