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

Oracle Discussion :

[SQL][Fonctions analytiques] : série cumulée personnalisée


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut [SQL][Fonctions analytiques] : série cumulée personnalisée
    Bonjour à tous,

    Oracle 9i Release 9.2.0.1.0

    Je voudrai en SQL (contrainte client, pas de PL/SQL : la requete SQL sert à alimenter un graphique côté applicatif), réussir à faire une série de données cumulée personnalisée, où chaque ligne de ma série dépendrai de la ligne précédente.

    Pas clair ? C'est normal ! Je vais vous expliquer au travers d'un exemple simple (ce que j'ai à réaliser est bcq plus complexe, mais cela suit le même principe).

    Exemple :
    Ligne 1 : DBMS_RANDOM(0,1)
    Ligne 2 : valeur de la ligne 1+SQRT(25)
    Ligne 3 : valeur de la ligne 2+SQRT(25)

    Ligne n : valeur de la ligne n-1+SQRT(25)

    L'esprit en SQL est un peu celui là, mais il ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT rownum,
           (CASE ROWNUM=1 THEN DBMS_RANDOM.VALUE(0,1) ELSE
                 (SELECT VALEUR+SQRT(25) FROM ALL_OBJECTS WHERE ROWNUM=ROWNUM-1) END) VALEUR
    FROM All_Objects
    WHERE ROWNUM<10
    J'ai parcouru l'excellent tutorial sur les fonctions analytiques de Laly sur DVP, mais je n'ai pas trouvé mon bonheur

    Quelqu'un pourrait il m'orienter ?

    Merci d'avance

    @

  2. #2
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Y a t'il une relation 1 à 1 entre l'enreg courant et l'enreg Precedent ?

    Si oui , tu dois pouvoir faire un truc du genre

    Select Opération_Sur(Precedent.valeur & Courant.Valeur)
    From Tab1 Precedent , Tab1 Courant
    Where Precedent.cle1 = Courant.cle2(+)

  3. #3
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par argoet
    Y a t'il une relation 1 à 1 entre l'enreg courant et l'enreg Precedent ?

    Si oui , tu dois pouvoir faire un truc du genre

    Select Opération_Sur(Precedent.valeur & Courant.Valeur)
    From Tab1 Precedent , Tab1 Courant
    Where Precedent.cle1 = Courant.cle2(+)
    Bonjour Argoet,

    Merci de ta réponse

    Il n'y a pas de relations entre les enregistrements au préalable. Il s'agit de générer des séries cumulatives en appelant des fonctions stockées en PL;
    Voilà pourquoi, j'ai recours à la table ALL_OBJECTS pour me générer mes séries !
    L'exemple que j'ai donné, c'est tout à fait ce que je veux réaliser !

    Une solution simple serait de procéder à un traitement PL de mes données, de charger ensuite mes lignes dans une table.
    Mais cette solution n'est pas du tout performante, car je dois ainsi pouvoir générer des dizaines de séries pour des graphiques, et je dois générer des centaines de graphiques !


  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je ne suis pas sûr d'avoir compris ton problème, mais voici une proposition :
    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
    SQL> select decode (rownum, 1, valeur, valeur + min (valeur) over (order by ordre))
      2  from (select dbms_random.value(0,1) valeur, 0 ordre
      3        from dual
      4        union all
      5        select sqrt(25) * rownum valeur, rownum ordre
      6        from all_objects)
      7  where rownum < 10;
     
    DECODE(ROWNUM,1,VALEUR,VALEUR+MIN(VALEUR)OVER(ORDERBYORDRE))
    ------------------------------------------------------------
                                                       .93137411
                                                       5.9313741
                                                       10.931374
                                                       15.931374
                                                       20.931374
                                                       25.931374
                                                       30.931374
                                                       35.931374
                                                       40.931374
     
    9 rows selected.
     
    SQL>
    Si ce n'est pas ce que tu attends merci d'illustrer ta demande par un exemple.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par plaineR
    Je ne suis pas sûr d'avoir compris ton problème, mais voici une proposition :
    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
    SQL> select decode (rownum, 1, valeur, valeur + min (valeur) over (order by ordre))
      2  from (select dbms_random.value(0,1) valeur, 0 ordre
      3        from dual
      4        union all
      5        select sqrt(25) * rownum valeur, rownum ordre
      6        from all_objects)
      7  where rownum < 10;
     
    DECODE(ROWNUM,1,VALEUR,VALEUR+MIN(VALEUR)OVER(ORDERBYORDRE))
    ------------------------------------------------------------
                                                       .93137411
                                                       5.9313741
                                                       10.931374
                                                       15.931374
                                                       20.931374
                                                       25.931374
                                                       30.931374
                                                       35.931374
                                                       40.931374
     
    9 rows selected.
     
    SQL>
    Si ce n'est pas ce que tu attends merci d'illustrer ta demande par un exemple.


    Merci énormément à toi plaineR, c'est tout à fait çà !!!!!


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

Discussions similaires

  1. [10g] SQL fonction analytique
    Par lenoil dans le forum SQL
    Réponses: 2
    Dernier message: 02/10/2009, 17h47
  2. [SQL / PL/SQL] fonction analytique last_value
    Par Nounoursonne dans le forum SQL
    Réponses: 7
    Dernier message: 23/08/2007, 21h18
  3. [SQL / PL/SQL] fonction analytique last_value
    Par Nounoursonne dans le forum Oracle
    Réponses: 7
    Dernier message: 23/08/2007, 21h18
  4. [SQL] [Oracle 9.2] fonctions analytiques grosses tables
    Par Hugues_78 dans le forum Oracle
    Réponses: 11
    Dernier message: 10/10/2006, 18h27
  5. SQL standard vers les fonctions analytiques
    Par Emmanuel Lecoester dans le forum Oracle
    Réponses: 7
    Dernier message: 02/10/2006, 19h27

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