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

Requêtes MySQL Discussion :

sum de quelques lignes


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut sum de quelques lignes
    Bonjour,

    je travail sur une bdd Mysql dans laquelle jai une table ayant ce qui ressemble à la structure suivante :

    client ---- periode-----FA
    1--------- mars 12----10
    1--------- mars 12----10
    1--------- mars 12----10

    1--------- Avril 12----20
    1--------- Avril 12----20
    1--------- Avril 12----20

    1--------- Mai 12-----30
    1--------- Mai 12-----30
    1--------- Mai 12-----30


    comme vous pouvez le remarquez : le montant de FA (colonne 3) est identique pour un Client (colonne 1) dans une Periode (colonne 2) ..

    je cherche la bonne requete sql pour avoir pour le client 1 les distinct somme de la colonne 3, a savoir : 10+20+30 = 60...

    j'ai essayé avec sum(FA) mais ca me fait la somme de toute les lignes càd : 10+10+10+20+20+20+30+30+30

    merci davance pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    D'abord tu DISTINCT par client et période et ensuite tu sommes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(fa) as sum_fa
      from (select distinct client, periode, fa
              from latable)

  3. #3
    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,


    Vous avez un problème de modélisation (ou des doublons), est-ce normal ?

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    D'abord tu DISTINCT par client et période et ensuite tu sommes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(fa) as sum_fa
      from (select distinct client, periode, fa
              from latable)
    j'ai essayé cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT sum(FA) AS 'cumulFA'  
    FROM (SELECT DISTINCT idClt, periode, FA  FROM matable)
    ca m'affiche le message d'erreur suivant :

    #1248 - Every derived table must have its own alias

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Et bien comme dit le message, il faut ajouter un alias à la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT sum(FA) AS 'cumulFA'  
    FROM 
    (
      SELECT DISTINCT idClt, periode, FA  
      FROM matable
    ) tmp
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    pour afficher le nom client je dois joinde matable avec la table client donc j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT i.sum(FA) AS 'cumulFA', c.libelle_clt, i.periode
    FROM (
    SELECT DISTINCT i.id_clt, i.periode, i.FA
    FROM `client` c, `matable` i
    )tmp
    WHERE c.id_clt = i.id_clt
    AND year( i.periode)= '2012'
    AND c.libelle_clt not in (...)
    Group by  c.libelle_clt, i.periode
    mais ca n'a pas trop l'air de marcher!!!

  7. #7
    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
    ah bah voila d'où viennent les doublons ! (j'espère du moins)

    Faudrai repartir sur les bases des jointures :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Et faites une consolidation des montants dans une sous-requêtes, pour ça utilisez un group by : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT c.libelle_clt, periode, sum( FA) as 'cumulFA'
    FROM (
    SELECT DISTINCT i.id_clt, i.periode, i.TA
    FROM `matable` i
    )tmp, client c
    WHERE tmp.id_clt  = c.id_clt 
    AND year(tmp.periode)= '2012'
    AND r.libelle_ress not in (...)
    resultat : affiche la somme (10+10+10+...+30+30+30) et que pour le premier client

    une idée?
    merci d'avance

  9. #9
    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
    oui, l'idée est que vous n'avez pas pri le temps de lire la doc linkée.

    Donc on reprend :
    - lisez l'article sur les ensembles => faites une première requête qui va consolider la sommes des FA par client (group by + sum) avec toutes les restrictions necessaires

    - lisez l'article sur les jointures => faites une jointures entre cette sous-requête et votre table client (la ca doit être bon vous savez déjà faire ca)

    Si le résultat n'est pas bon n'hesitez pas à revenir.

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    voivi ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c.libelle_clt, periode, sum(FA) AS 'cumulFA'
    FROM (
    SELECT DISTINCT i.id_clt, i.periode, i.FA
    FROM `matable` i
    WHERE year(periode)= '2012'
    AND periode <= '2012-06-01' 
    Group by i.id_clt, i.periode, i.FA)tmp, client c
    WHERE tmp.id_clt= c.id_clt
    AND c.libelle_clt Not in (...)
    j'ai essayé ceci egalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT c.libelle_clt, periode, sum(FA) AS 'cumulFA'
    FROM (
    SELECT DISTINCT i.id_clt, i.periode, i.FA
    FROM `matable` i, client c
    WHERE i.id_clt= c.id_clt
    AND AND c.libelle_clt Not in (...)
    AND  year(periode)= '2012'
    AND periode <= '2012-06-01' 
    Group by i.id_clt, i.periode, i.FA)tmp, client c
    WHERE tmp.id_clt= c.id_clt
    les deux requetes donnent le meme resultat :
    affiche la somme (10+10+10+...+30+30+30) et que pour le premier client

    si vous pouvez me répondre par exemple concrét ...ca m'aidera bcp plus

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    client ---- periode-----FA
    1--------- mars 12----10
    1--------- mars 12----10
    1--------- mars 12----10
    1--------- Avril 12----20
    1--------- Avril 12----20
    1--------- Avril 12----20
    1--------- Mai 12-----30
    1--------- Mai 12-----30
    1--------- Mai 12-----30
    Ce qui précède est-il le vrai contenu de la table que vous anonymisez "matable" dans votre requête ?

    Si oui, pourquoi contient-elle des triplons ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    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
    car elle fait une jointure cartesienne avec l'autre table

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Bon reprenons...

    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) En SQL, les valeurs textuelles s'entourent d'apostrophes, pas de guillemets !


    Somme des FA par client et par période :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_clt, periode, SUM(FA) AS Somme_FA
    FROM matable
    WHERE YEAR(periode) = 2012
    	AND periode <= '2012-06-01'
    GROUP BY id_clt, periode
    Jointure de cette requête avec la table client pour récupérer le nom du client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT c.libelle_clt, tmp.periode, tmp.Somme_FA
    FROM client c
    INNER JOIN
    (
    	SELECT id_clt, periode, SUM(FA) AS Somme_FA
    	FROM matable
    	WHERE YEAR(periode) = 2012
    		AND periode <= '2012-06-01'
    	GROUP BY id_clt, periode
    ) tmp ON tmp.id_clt = c.id_clt
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    ca donne toujours pas le bon resultat

    pour la premiere requete (Somme des FA par client et par période ), j'ai essayé ceci pour un seul client (4) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT id_clt, periode, sum(FA)
    FROM (
    SELECT
    DISTINCT id_clt, periode, FA
    FROM  `matable` 
    WHERE  
    id_clt = 4
    AND year( periode)= '2012'
    AND periode <= '2012-06-01'
    Group by  id_clt, periode, TA)tmp
    et ca a donné le bon résultat

    puis j'ai voulu généraliser la requete pour tous les clients, donc j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT tmp.id_clt, periode, sum(FA)
    FROM (
    SELECT
    DISTINCT id_clt, periode, FA
    FROM  `matable` 
    WHERE   
    year( periode)= '2012'
    AND periode <= '2012-06-01'
    Group by  id_clt, periode, TA) tmp, client c
    WHERE 
    c.id_clt = tmp.id_clt 
    AND libelle_clt not in ()
    mais le resultat n'est plus correct

    une idée?

    merci d'avance

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Pfff ! Tu as essayé mes requêtes ?
    Ce ne sont pas du tout les mêmes que les tiennes qui utilisent DISTINCT + GROUP BY, c'est à dire ceinture et bretelles !

    En plus, dans ton GROUP BY, je vois un id_ress qui ne figure pas dans le SELECT. Kesako ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  16. #16
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pfff ! Tu as essayé mes requêtes ?
    Ce ne sont pas du tout les mêmes que les tiennes qui utilisent DISTINCT + GROUP BY, c'est à dire ceinture et bretelles !

    En plus, dans ton GROUP BY, je vois un id_ress qui ne figure pas dans le SELECT. Kesako ?
    pffff?!!!!!!!!!!

    de 1: cette requete je l'ai essayé hier soir ...et dans la mienne j'ai pas le SUM(fA)...j'ai plutit FA direct ...
    et sinon ca m'aurai pas géné d'utilisé la tienne si ca donné le bon resultat,

    pour le id_ress...cest rectifié

  17. #17
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    de 1: cette requete je l'ai essayé hier soir
    T'es fort toi ! J'ai posté mes requêtes ce matin à 9h18 !

    Alors maintenant, si tu veux qu'on t'aide, donne la astructure exacte des tables à utiliser, un petit jeu de données, une expression claire du besoin et le résultat attendu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Pouvez vous me déchiffrer ces quelques lignes
    Par lylia SI dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 19/02/2008, 11h00
  2. recuperation de quelque ligne sur un fichier séquenciel
    Par scofild20 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/08/2007, 14h09
  3. Besoin d'aide pour traduire ces quelques lignes
    Par sircus dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2006, 16h11
  4. [css] desactiver la css sur quelques ligne ?
    Par banzzai dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 06/06/2006, 11h39

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