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

PL/SQL Oracle Discussion :

Boucle sous PL/SQL [10g]


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Boucle sous PL/SQL
    Bonjour à tous,
    je cherche désespérément à stratifier un ensemble d'opération à partir d'une vue.
    La vue se compose de la manière suivante :
    OP   | date de début | date de fin  |  valeur  |  montant
    OP1  |  11/11/2012   |  11/11/2022  |   4.5    |   1 000
    OP2  |  02/04/2000   |  02/04/2020  |   1.2    |     500
    OP3  |  01/05/2010   |  10/05/2014  |   9      |   4 000
    ce que je cherche à faire est stratifier ces opérations en fonction du champ "valeur" en faisant la somme des montants de la manière suivante :
    A : somme montant pour les opérations dont "valeur" est comprise entre 0 et 0.5
    B : somme montant pour les opérations dont "valeur" est comprise entre 0.5 et 1
    C : somme montant pour les opérations dont "valeur" est comprise entre 1 et 1.5
    et ainsi de suite jusqu'à 10

    Je pensais faire un if, mais il faut que j'en fasse 20 et cela me parait assez lourd

    connaitriez vous un moyen plus simple ?

    merci

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Qu'est ce que tu as dépensé comme effort en terme de programmation.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Rien ne vous oblige à répondre

    J'ai commencé à travailler sur des stratifications à partir de date
    cela donne :

    Code sql : 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
    select t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           t.amortizing_type,
           t.currency,
           t.attribute_1,
           t.attribute_2,
           t.family,
           sum (t.outstanding),
           '@0Y-5Y' as tb
      from ma table t
     where add_months(trunc(sysdate), 5 * 12) > t.maturity_date
       and t.date like '201009%'
    group by t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           t.amortizing_type,
           t.currency,
           t.attribute_1,
           t.attribute_2,
           t.family,
           '@0Y-5Y'

    en terme de longueur, c'est supportable puisqu'il n'y a que 3 "répétitions"
    0-5 y / 5-10 y / 10-15y

    Par contre, pour des strates plus nombreuses (dans le cas que je présente, 20), je souhaiterais savoir s'il existe d'autres moyens

    merci

  4. #4
    Membre habitué Avatar de Razorflak
    Homme Profil pro
    Développeur Flex/AS3
    Inscrit en
    Juin 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Flex/AS3
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 97
    Points : 192
    Points
    192
    Par défaut
    Bonjour,
    je comprend se que tu essayes de faire mais par contre une fois que tu fait tes boucles quesque tu cherches à obtenir à la fin de ta fonction (comme tu parles de PL/SQL) ? Une chaine avec des séparateur, un tableau, ... ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    j'aimerais récupérer sous forme de tableau avec la colonne supplémentaire mentionnant la stratification

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Si vous faites un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mod(trunc(valeur * 2), 20)
    dans le group by vous aurez directement vos valeurs groupés

    1,7 deviendrait 3
    0,2 deviendrait 0
    0,6 deviendrait 1
    Etc

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    merci pour votre réponse

    voici le code

    Code sql : 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
    select t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           t.attribute_1,
           t.attribute_2,
           sum(t.outstanding),
           'valeur' as strates
      from matable t
     where mod(trunc(t.rate_value*2), 20)>t.rate_value
       and t.partition_key like '2013%'
       and t.family = '10107'
     
    group by t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           --t.amortizing_type,
           --t.currency,
           t.attribute_1,
           t.attribute_2,
           --t.family,
           'strate'

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    et voici le résultat
    Images attachées Images attachées  

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    voila au final le code que j'ai fait

    Code sql : 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
    46
    47
    48
    49
    select t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           t.attribute_1,
           t.attribute_2,
           sum(t.outstanding),
          case when t.rate_value < 0.5 then 'A'
             else case when t.rate_value >=0.5 and t.rate_value<1 then 'B'
               else case when t.rate_value >=1 and t.rate_value< 1.5 then 'C'
                 else case when t.rate_value >=1.5 and t.rate_value<2 then 'D'
                   else case when t.rate_value >=2 and t.rate_value<2.5 then 'E'
                     else case when t.rate_value >=2.5 and t.rate_value<3 then 'F'
                       else case when t.rate_value >=3 and t.rate_value<3.5 then 'G'
                         else case when t.rate_value >=3.5 and t.rate_value<4 then 'H'
                           else case when t.rate_value >=4 and t.rate_value<4.5 then 'I'
                             else case when t.rate_value >=4.5 and t.rate_value<5 then 'J'
                               else case when t.rate_value >=5 and t.rate_value<5.5 then 'K'
                                 else case when t.rate_value >=5.5 and t.rate_value<6 then 'L'
                                   else case when t.rate_value >=6 and t.rate_value<6.5 then 'M'
                                     else case when t.rate_value >=6.5 and t.rate_value<7 then 'N'
                                        else 'O' end end end end end end end end end end end end end end as Stratification
      from matable t
     
     
    group by t.contract_type,
           t.contract_desc,
           t.rate,
           t.rate_value,
           --t.amortizing_type,
           --t.currency,
           t.attribute_1,
           t.attribute_2,
           --t.family,
           case when t.rate_value < 0.5 then 'A'
             else case when t.rate_value >=0.5 and t.rate_value<1 then 'B'
               else case when t.rate_value >=1 and t.rate_value< 1.5 then 'C'
                 else case when t.rate_value >=1.5 and t.rate_value<2 then 'D'
                   else case when t.rate_value >=2 and t.rate_value<2.5 then 'E'
                     else case when t.rate_value >=2.5 and t.rate_value<3 then 'F'
                       else case when t.rate_value >=3 and t.rate_value<3.5 then 'G'
                         else case when t.rate_value >=3.5 and t.rate_value<4 then 'H'
                           else case when t.rate_value >=4 and t.rate_value<4.5 then 'I'
                             else case when t.rate_value >=4.5 and t.rate_value<5 then 'J'
                               else case when t.rate_value >=5 and t.rate_value<5.5 then 'K'
                                 else case when t.rate_value >=5.5 and t.rate_value<6 then 'L'
                                   else case when t.rate_value >=6 and t.rate_value<6.5 then 'M'
                                     else case when t.rate_value >=6.5 and t.rate_value<7 then 'N'
                                        else 'O' end end end end end end end end end end end end end end

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    c'est ce que je voulais éviter, donc si vous avez une solution plus ergonomique, je suis preneur

    merci !

  11. #11
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Bonjour,

    Déjà, il n'est pas nécessaire d'imbriquer des instructions case. Une seule suffit:

    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
     
    case when t.rate_value < 0.5                      then 'A'
         when t.rate_value >=0.5 AND t.rate_value<1   then 'B'
         when t.rate_value >=1   AND t.rate_value<1.5 then 'C'
         when t.rate_value >=1.5 AND t.rate_value<2   then 'D'
         when t.rate_value >=2   AND t.rate_value<2.5 then 'E'
         when t.rate_value >=2.5 AND t.rate_value<3   then 'F'
         when t.rate_value >=3   AND t.rate_value<3.5 then 'G'
         when t.rate_value >=3.5 AND t.rate_value<4   then 'H'
         when t.rate_value >=4   AND t.rate_value<4.5 then 'I'
         when t.rate_value >=4.5 AND t.rate_value<5   then 'J'
         when t.rate_value >=5   AND t.rate_value<5.5 then 'K'
         when t.rate_value >=5.5 AND t.rate_value<6   then 'L'
         when t.rate_value >=6   AND t.rate_value<6.5 then 'M'
         when t.rate_value >=6.5 AND t.rate_value<7   then 'N'
         else 'O' 
    end
    Ensuite, comme l'a signalé Rams7s on pourrait se baser sur la valeur de t.rate_value pour en déduire un numéro équivalent à la position dans l'alphabet de la lettre à afficher. Et la fonction chr() permet de transposer ce numéro en cette lettre.

    Ceci devrait donner des résultats équivalent au premier bloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    case 
         when t.rate_value < 0 then 'A'
         when trunc(t.rate_value * 2) + 1 < 15  then chr(64 + trunc(t.rate_value * 2) + 1)
         else 'O'
    end

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Ok merci beaucoup ça marche

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

Discussions similaires

  1. problème sous-requête SQL et order by
    Par aguest dans le forum Requêtes
    Réponses: 10
    Dernier message: 26/12/2005, 23h57
  2. Sous requette sql je pense ?
    Par lotus77777 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 19h40
  3. Sous-requêtes SQL
    Par mandrake256 dans le forum WinDev
    Réponses: 6
    Dernier message: 21/06/2005, 10h15
  4. format date sous postgres sql
    Par ruppert62 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 27/05/2005, 12h04
  5. Désactiver un trigger sous MS Sql Server
    Par WOLO Laurent dans le forum Développement
    Réponses: 6
    Dernier message: 03/07/2003, 12h51

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