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 :

Problème requête Oracle


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 71
    Points : 49
    Points
    49
    Par défaut Problème requête Oracle
    Bonjour le monde

    mon problème et comme suit :

    j'ai une table mouvement qui contient :

    compte type operation date operation (virement ou retrait) montant operation


    je veux faire un select comme suit :

    le nombre de compte avec les conditions suivantes : virement entre '01/01/2017' et '01/01/2018' dont le montant >3000 dinars
    et dont la somme des opérations de retrait effectuer 30 jour après la date du virement sont >2000



    autrement en utilisant oracle c'est quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*) from mouvement 
    where date_operation between '01/01/2017' and '01/01/2018'
    AND MONTANT >=3000
    and (select sum(montant) from d_mouvement_par where type_operation='retrait' and date_operation between date_operation(du virement)   and dte_operation(du virement)+30 )>2000


    merci pour votre aide

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il suffit de préfixer par le nom de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*) from mouvement
    where date_operation between '01/01/2017' and '01/01/2018'
    AND MONTANT >=3000
    and (select sum(montant) from d_mouvement_par where type_operation='retrait' and date_operation between mouvement.date_operation   and mouvement.dte_operation+30 )>2000
    ou avec des alias
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*) from mouvement mvt
    where date_operation between '01/01/2017' and '01/01/2018'
    AND MONTANT >=3000
    and (select sum(montant) from d_mouvement_par d where type_operation='retrait' and d.date_operation between mvt.date_operation   and mvt.dte_operation+30 )>2000
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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
     
    with data as (
        select 'A' as compte, 'virement' as type_operation, 4000 as montant, to_date('01-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'A' as compte, 'retrait' as type_operation, 1000 as montant, to_date('08-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'A' as compte, 'retrait' as type_operation, 1100 as montant, to_date('12-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'B' as compte, 'virement' as type_operation, 4000 as montant, to_date('01-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'B' as compte, 'retrait' as type_operation, 1000 as montant, to_date('08-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'B' as compte, 'retrait' as type_operation, 900 as montant, to_date('12-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'C' as compte, 'virement' as type_operation, 4000 as montant, to_date('01-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'C' as compte, 'retrait' as type_operation, 1000 as montant, to_date('08-01-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'C' as compte, 'retrait' as type_operation, 1100 as montant, to_date('12-02-2017', 'dd-mm-yyyy') as date_op from dual
        union
        select 'D' as compte, 'virement' as type_operation, 4000 as montant, to_date('01-01-2019', 'dd-mm-yyyy') as date_op from dual
        union
        select 'F' as compte, 'virement' as type_operation, 2000 as montant, to_date('01-01-2017', 'dd-mm-yyyy') as date_op from dual
     
    )
    select d.compte from data d,
        lateral(select sum(d1.montant) as retraits from data d1 where d1.compte = d.compte and d1.type_operation = 'retrait'
            and d1.date_op between d.date_op and d.date_op + 30
            having(sum(d1.montant) > 2000)
        ) sd
    where d.date_op between to_date('01-01-2017', 'dd-mm-yyyy') and to_date('01-01-2018', 'dd-mm-yyyy')
        and d.type_operation = 'virement' and d.montant > 3000 ;

  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
    Solution sans jointure :
    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
    with cte_mouvement as
    (
    select 'A' as compte, 'virement' as type_operation, 4000 as montant, date '2017-01-01' as date_op from dual union all
    select 'A' as compte, 'retrait'  as type_operation, 1000 as montant, date '2017-01-08' as date_op from dual union all
    select 'A' as compte, 'retrait'  as type_operation, 1100 as montant, date '2017-01-12' as date_op from dual union all
    select 'B' as compte, 'virement' as type_operation, 4000 as montant, date '2017-01-01' as date_op from dual union all
    select 'B' as compte, 'retrait'  as type_operation, 1000 as montant, date '2017-01-08' as date_op from dual union all
    select 'B' as compte, 'retrait'  as type_operation,  900 as montant, date '2017-01-12' as date_op from dual union all
    select 'C' as compte, 'virement' as type_operation, 4000 as montant, date '2017-01-01' as date_op from dual union all
    select 'C' as compte, 'retrait'  as type_operation, 1000 as montant, date '2017-01-08' as date_op from dual union all
    select 'C' as compte, 'retrait'  as type_operation, 1100 as montant, date '2017-02-12' as date_op from dual union all
    select 'D' as compte, 'virement' as type_operation, 4000 as montant, date '2019-01-01' as date_op from dual union all
    select 'F' as compte, 'virement' as type_operation, 2000 as montant, date '2017-01-01' as date_op from dual
    )
      ,  cte_calc_retrait_30j as
    (
    select compte
         , type_operation
         , montant
         , date_op
         , case type_operation
             when 'virement'
             then sum(case type_operation when 'retrait' then montant else 0 end) over(partition by compte order by date_op asc range between current row and interval '30' day following)
             else 0
           end as mnt_retrait_30j
      from cte_mouvement
     where date_op >= date '2017-01-01'
       and date_op <  date '2018-01-01' + 30
    )
    select *
      from cte_calc_retrait_30j
     where date_op         >= date '2017-01-01'
       and date_op         <  date '2018-01-01'
       and type_operation   = 'virement'
       and montant         >= 3000
       and mnt_retrait_30j >  2000
    ;

Discussions similaires

  1. Incompréhensible : problème requête Oracle 9i
    Par mithrendil dans le forum JDBC
    Réponses: 2
    Dernier message: 18/09/2014, 14h51
  2. Problème requête Oracle
    Par newmar dans le forum SQL
    Réponses: 1
    Dernier message: 28/05/2008, 07h45
  3. Problème requête SELECT ORACLE
    Par vizlebiz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2008, 16h20
  4. [Oracle] Problème requête somme
    Par baptus dans le forum Langage SQL
    Réponses: 24
    Dernier message: 23/03/2006, 08h33
  5. Réponses: 6
    Dernier message: 20/09/2004, 15h26

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