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

Langage SQL Discussion :

Sum avec condition


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Points : 31
    Points
    31
    Par défaut Sum avec condition
    Bonjour,

    Je voudrais savoir s'il est possible de faire la chose suivante :

    En fait avec cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    select devise, round(sum(montant1),2), round(sum(montant2),2) 
    from factures 
    group by devise
    j'obtient :

    devise | somme(montant1) | somme(montant2)


    j'aimerais avoir deux champs en plus calculés en fonction de dates, c'est a dire :
    somme de montant1 dont date>aujourd'hui et somme de montant1 dont date<aujourd'hui

    donc ça :

    devise | somme(montant1) | somme(Montant2) | somme(montant1) à date<aujourd'hui | somme(montant1) à date>aujourd'hui

    est-ce possible ?


    on va dire que la structure de ma table est la suivante :

    idfacture, facture, montant1, montant2, date, devise

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Sans vous donner la solution complète, faire une somme de si date < aujourd'hui alors montant1 sinon 0 devrait vous mettre sur la bonne voie.

  3. #3
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Salut,
    Quel est ton SGBD ?
    Est-ce que tu pourrais donner un exemple d'enregistrements dans ta table et nous dire quel résultat tu espères avoir à l'issue de ta requête ?
    A priori ce que tu demandes est possible, je pense qu'il suffirait de faire une jointure entre trois alias de ta table et un where pour les deux conditions. Tu récupère les deux premières sommes de ta table t, la somme de montant1 telle que date < aujourd'hui de ta table t1 et finalement la somme de montant2 telle que date > aujourd'hui de ta table t2.
    Cette idée est la première qui m'est venue à l'esprit. Il peut y en avoir de meilleures. Essaie déjà pour voir et dis moi ce qu'il en est.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    tu peux faire ceci si ton SGBDR le permet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select devise, sum(montant1), sum(montant2),
                      (select sum(montant1)  
                       from factures fact2 
                       Where factures.devise=fact2.devise
                       and Fact2.date<sysdate) ,
                       (select sum(montant1) 
                        from factures fact3 
                        Where factures.devise=fact3.devise
                        and Fact3.date>sysdate) 
              from factures 
              group by devise

  5. #5
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par teach Voir le message
    tu peux faire ceci si ton SGBDR le permet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select devise, sum(montant1), sum(montant2),
                      (select sum(montant1)  
                       from factures fact2 
                       Where factures.devise=fact2.devise
                       and Fact2.date<sysdate) ,
                       (select sum(montant1) 
                        from factures fact3 
                        Where factures.devise=fact3.devise
                        and Fact3.date>sysdate) 
              from factures 
              group by devise
    Salut,
    Je ne pense pas qu'on soit obligé de faire trois select un seul select est suffisant. La sélection se fera à partir de trois alias de table.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Votre solution ne me paraît pas très performante.

    Je suggérais le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select
        devise,
        round(sum(montant1),2) AS "montant1",
        round(sum(montant2),2) AS "montant2",
        round(sum(case when date < CURRENT_DATE then montant1 else 0 end),2) AS "montant1_passé",
        round(sum(case when date >= CURRENT_DATE then montant1 else 0 end),2) AS "montant1_futur"
    from
        factures
    group by
        devise
    Notez que j'ai mis >= dans le montant_futur, à moins que vous ne vouliez vraiment exclure les données du moment présent.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Wha !!

    Merci pour votre réponse, je vais tester tout ça demain et je vous tiens au courant

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    bonjour,

    cette requete marche nikel dans oracle direct

    par contre dans VB qd j'essaie de 'lexecuter, il me fait l'erreur etrange : *

    'paranthese de droite absente'

    j'avoue que j'comprend rien

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par lanjolanjo Voir le message
    bonjour,

    cette requete marche nikel dans oracle direct

    par contre dans VB qd j'essaie de 'lexecuter, il me fait l'erreur etrange : *

    'paranthese de droite absente'

    j'avoue que j'comprend rien
    L'erreur est pourtant suffisamment explicite!

    Vérifie le parenthèsage de ta requête, il doit manquer une parenthèse fermante qques part

    ++

Discussions similaires

  1. SUM avec conditions
    Par Archi89 dans le forum Développement
    Réponses: 4
    Dernier message: 10/12/2014, 09h11
  2. Aide avec fonction SUM avec condition
    Par Beaudelicius dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/01/2012, 23h30
  3. Requête SUM avec conditions
    Par madsland dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/03/2011, 17h34
  4. Sum() et Sum(avec condition)
    Par titom100 dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/05/2010, 17h49
  5. Faire un SUM avec conditions sans tables temporaires
    Par jonklay dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 03/01/2007, 10h39

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