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 :

Faire somme de plusieurs champs


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Faire somme de plusieurs champs
    Bonjour,


    J'ai une requête SQL à effectuer pour ensuite l'afficher dans un tableau mais le résultat retourné par la requête est faux.
    Ça ne me retourne pas le bon montant.
    Je chercher à additionner tous les montants hors-forfait saisis par mois + montantFrais * quantite.

    Voilà ce que j'ai :
    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
        SELECT FicheFrais.idEtat AS etat
             , FicheFrais.mois   AS mois
             , montantValide
             , SUM(LigneHorsForfait.montant + (LigneFrais.quantite * FraisForfait.montant)) AS montantFrais
          FROM FicheFrais
    INNER JOIN LigneFrais
            ON LigneFrais.idMembre       = FicheFrais.idMembre
           AND LigneFrais.mois           = FicheFrais.mois
    INNER JOIN FraisForfait
            ON FraisForfait.id           = LigneFrais.idFraisForfait
    INNER JOIN LigneHorsForfait
            ON LigneHorsForfait.idMembre = FicheFrais.idMembre
           AND LigneFraisForfait.mois    = FicheFrais.mois
    INNER JOIN Etat
            ON Etat.id = FicheFrais.idEtat
         WHERE FicheFrais.idMembre = 'a131'
           AND FicheFrais.mois BETWEEN 201305 AND 201310
      GROUP BY FicheFrais.mois;

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    passez par 2 requetes. La vous additionnez des choux et des carottes a cause des jointures non maitrisées

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai fait aussi un truc comme ça.

    J'ai bien les bons montants mais pas additionnés :
    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
        select SUM(LigneHorsForfait.montant) AS montantFrais
             , FicheFrais.idEtat             AS etat
             , FicheFrais.mois               AS mois
             , montantValide
          from FicheFrais
    inner join LigneHorsForfait
            on FicheFrais.idMembre   = LigneHorsForfait.idMembre
           and LigneHorsForfait.mois = FicheFrais.mois
    inner join Etat
            on Etat.id = FicheFrais.idEtat
         Where FicheFrais.idMembre ='a131'
           AND FicheFrais.mois Between 201305 and 201310
      group by etat, mois, montantValide
         UNION
        select SUM(LigneFrais.quantite * FraisForfait.montant) AS montantFrais
             , FicheFrais.idEtat                               AS etat
             , FicheFrais.mois                                 AS mois
             , montantValide
          from FicheFrais
    inner join LigneFrais
            on LigneFrais.idMembre = FicheFrais.idMembre
           and LigneFrais.mois     = FicheFrais.mois
    inner join FraisForfait
            on FraisForfait.id = LigneFrais.idFraisForfait
    inner join Etat
            on Etat.id = FicheFrais.idEtat
         Where FicheFrais.idMembre = 'a131'
           AND FicheFrais.mois Between 201305 and 201310
      group by etat, mois, montantValide;
    J'ai ceci :
    201308 	729.00 		3181.91 	
    201309 	366.00 		902209.92 	
    201310 	1498.00 	0.00 	
    201305 	1987.00 	3848.91 	
    201306 	1320.00 	3695.18 	
    201307 	2419.00 	4190.29 	
    201308 	3151.38 	3181.91 	
    201309 	1099890.00 	902209.92 	
    201310 	2601.98 	0.00
    201305 	2824.14 	3848.91 	
    201306 	3079.02 	3695.18
    201307 	2397.42 	4190.29
    Alors que par exemple, je dois avoir :
    201310     4099.98    0.00

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Vous pouvez effectuer une jointure entre deux sous-requetes

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai pas deux sous requete là?

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Vous y étiez presque :
    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
     
    SELECT SUM(montantFrais)
         , etat
         , mois
         , MontantValide
    from (    
     SELECT   LigneHorsForfait.montant         AS montantFrais
            , FicheFrais.idEtat                AS etat
            , FicheFrais.mois                  AS mois
            , montantValide
            FROM FicheFrais
         INNER JOIN LigneHorsForfait
              ON FicheFrais.idMembre    = LigneHorsForfait.idMembre
              AND LigneHorsForfait.mois = FicheFrais.mois
         INNER JOIN Etat
              ON Etat.id            = FicheFrais.idEtat
           WHERE FicheFrais.idMembre='a131'
              AND FicheFrais.mois BETWEEN 201305 AND 201310
      UNION ALL
     SELECT   LigneFrais.quantite * FraisForfait.montant         AS montantFrais
            , FicheFrais.idEtat                                  AS etat
            , FicheFrais.mois                                    AS mois
            , montantValide
            FROM FicheFrais
         INNER JOIN LigneFrais
              ON LigneFrais.idMembre= FicheFrais.idMembre
              AND LigneFrais.mois   = FicheFrais.mois
         INNER JOIN FraisForfait
              ON FraisForfait.id = LigneFrais.idFraisForfait
         INNER JOIN Etat
              ON Etat.id            = FicheFrais.idEtat
           WHERE FicheFrais.idMembre='a131'
              AND FicheFrais.mois BETWEEN 201305 AND 201310
    )
    GROUP BY etat
           , mois
           , montantValide ;
    1. Remplacement du UNION par UNION ALL, sinon les doublons seraient éliminés

    2. Le SUM est à faire sur le résultat du UNION ALL


    Cdlt,
    OD

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Ça me met cette erreur :
    #1248 - Every derived table must have its own alias
    J'ai donc essayer de mettre des allias mais rien y fait, j'ai toujours cette erreur

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    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
    33
    34
    35
    36
    SELECT SUM(montantFrais)
         , etat
         , mois
         , MontantValide
    FROM (    
     SELECT   LigneHorsForfait.montant         AS montantFrais
            , FicheFrais.idEtat                AS etat
            , FicheFrais.mois                  AS mois
            , montantValide
            FROM FicheFrais
         INNER JOIN LigneHorsForfait
              ON FicheFrais.idMembre    = LigneHorsForfait.idMembre
              AND LigneHorsForfait.mois = FicheFrais.mois
         INNER JOIN Etat
              ON Etat.id            = FicheFrais.idEtat
           WHERE FicheFrais.idMembre='a131'
              AND FicheFrais.mois BETWEEN 201305 AND 201310
      UNION ALL
     SELECT   LigneFrais.quantite * FraisForfait.montant         AS montantFrais
            , FicheFrais.idEtat                                  AS etat
            , FicheFrais.mois                                    AS mois
            , montantValide
            FROM FicheFrais
         INNER JOIN LigneFrais
              ON LigneFrais.idMembre= FicheFrais.idMembre
              AND LigneFrais.mois   = FicheFrais.mois
         INNER JOIN FraisForfait
              ON FraisForfait.id = LigneFrais.idFraisForfait
         INNER JOIN Etat
              ON Etat.id            = FicheFrais.idEtat
           WHERE FicheFrais.idMembre='a131'
              AND FicheFrais.mois BETWEEN 201305 AND 201310
    ) AS T --> ALIAS MANQUANT !!!
    GROUP BY etat
           , mois
           , montantValide ;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    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
    Je confirme ce que Olivier Dufour a dit.
    @totot, Puisque tu a eu un résultat attendu, donc tu mets une autre requête sur la sous requête (la première) .
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Merci beaucoup !

    Sinon comme je ne trouvais pas je suis passé par une autre solution qui fonctionne parfaitement : j'ai fait deux requêtes et j'ai fait la somme dans mon tableau.

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

Discussions similaires

  1. [MySQL] Faire somme de plusieurs champs de table différentes
    Par totot dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/10/2013, 15h07
  2. Réponses: 2
    Dernier message: 02/02/2008, 22h38
  3. [requete]somme de plusieur champs séparés
    Par Neilime05 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/04/2007, 21h15
  4. Somme de plusieurs champs
    Par zapatta dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/09/2006, 14h27
  5. Fonction vba somme de plusieurs champs
    Par Greg84 dans le forum Access
    Réponses: 4
    Dernier message: 09/08/2006, 15h16

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