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 :

Somme sur champ, avec conditions


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut Somme sur champ, avec conditions
    J'ai à ma disposition une table ayant la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE IF NOT EXISTS `liste` (
      `Equipement#` varchar(11) NOT NULL,
      `SiteGeo_Equipement` varchar(11) NOT NULL,
      `NUM_SITE_THEORIQUE1` varchar(11) DEFAULT NULL,
      `trafic` int(11) DEFAULT NULL,
      `SiteGeo_Routage` varchar(11) NOT NULL,
      `NUM_SITE_THEORIQUE2` varchar(11) DEFAULT NULL,
      `TYPE_SITE_THEORIQUE` varchar(11) DEFAULT NULL,
      KEY `NUM_SITE_THEORIQUE` (`NUM_SITE_THEORIQUE2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Le contenu de la table `liste` est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO `lister12` (`Equipement#`, `SiteGeo_Equipement`, `NUM_SITE_THEORIQUE1`, `trafic`, `SiteGeo_Routage`, `NUM_SITE_THEORIQUE2`) VALUES
    ('S10017', 'SI031091', 'T10017', 10, 'SI031091', 'T10017'),
    ('S16384', 'SI034895', 'T11847', 20, 'SI031091', 'T10017'),
    ('S11847', 'SI034895', 'T11847', 20, 'SI031091', 'T10017'),
    ('S11848', 'SI033654', 'T11848', 40, 'SI031091', 'T10017'),
    ('S10019', 'SI030488', 'T10019', 0, 'SI030488', 'T10019'),
    ('S17996', 'SI334186', 'T17996', 10, 'SI030488', 'T10019'),
    ('S11748', 'SI146075', 'T11748', 20, 'SI030488', 'T10019');
    J'aimerais récupérer une table contenant les informations suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NUM_SITE_THEORIQUE2 |  somme_trafic
    T10017	            |  70
    T10019              |  30
    Sachant que 70 correspond à 10+20+40 (comme SI034895 se répète 2 fois je ne veux pas l'inclure dans la somme).
    ET 30 correspond à 0+10+20.

    J'ai pensé à utiliser la fonction SUM, mais je ne sais pas comment faire, et peut être qu'il y une autre manière de faire.

    Merci à vous!

    Cordialement.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton tu peux faire une sous-requête pour supprimer les doublons avec DISTINCT puis faire la somme en GROUP BY sur le résultat de cette sous-requête

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton tu peux faire une sous-requête pour supprimer les doublons avec DISTINCT puis faire la somme en GROUP BY sur le résultat de cette sous-requête
    Voilà la requête permettant de faire la somme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NUM_SITE_THEORIQUE2, SiteGeo_Equipement, SUM(liste.trafic) as trafic
    FROM fin, lister12
    WHERE liste.NUM_SITE_THEORIQUE2=fin.site_theorique
    GROUP BY NUM_SITE_THEORIQUE2
    Mais comment dois-je intégrer la requête permettant de supprimer les doublons dans le champ `SiteGeo_Equipement`???

    Merci.

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Ou-la il y a une jointure-là, avec la table fin, ce n'était pas dans le post initial.
    Il faut que j'y regarde à 2 fois, du coup.

    Au fait, à quoi sert-elle la table fin dans cette requête ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Ou-la il y a une jointure-là, avec la table fin, ce n'était pas dans le post initial.
    Il faut que j'y regarde à 2 fois, du coup.

    Au fait, à quoi sert-elle la table fin dans cette requête ?
    Tu vas peut être trouver ça bête mais en tant que débutant j'ai tendance à créer des tables et faire des requêtes super tordues. 'fin' est une table contenant un seul champ reprenant le contenu du champ 'NUM_SITE_THEORIQUE2':
    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
     
    CREATE TABLE IF NOT EXISTS `fin` (
      `site_theorique` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
     
    -- Contenu de la table `fin`
    --
     
    INSERT INTO `fin` (`site_theorique`) VALUES
    ('T10001'),
    ('T10002'),
    ('T10003'),
    ('T10004'),
    ('T10005'),
    ('T10006'),
    ('T10007'),
    ('T10008'),
    ('T10009'),
    ('T10010'),
    ('T10011'),
    ('T10012'),
    ('T10013'),
    ('T10014'),
    ('T10016'),
    ('T10017'),
    ('T10018'),
    ('T10019'),
    Cette table me sert à faire la jointure (liste.NUM_SITE_THEORIQUE2=fin.site_theorique) grâce à laquelle (à ma vision) j'obtiens les sites qui m'interessent.

    Je ne sais pas s'il y a une autre méthode de faire sans avoir besoin de créer cette table "bidon" à champ unique.

    Merci.

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Si l'on vire la table fin, ça donne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT sr.NUM_SITE_THEORIQUE2,  SUM(sr.trafic) AS somme_trafic
    FROM
    (SELECT DISTINCT `Equipement#`,  `SiteGeo_Equipement`,  `trafic`,   `NUM_SITE_THEORIQUE2` FROM lister12) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par aiss57 Voir le message
    Cette table me sert à faire la jointure (liste.NUM_SITE_THEORIQUE2=fin.site_theorique) grâce à laquelle (à ma vision) j'obtiens les sites qui m'interessent.

    Je ne sais pas s'il y a une autre méthode de faire sans avoir besoin de créer cette table "bidon" à champ unique.
    Rien capté !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Si l'on vire la table fin, ça donne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT sr.NUM_SITE_THEORIQUE2,  SUM(sr.trafic) AS somme_trafic
    FROM
    (SELECT DISTINCT `Equipement#`,  `SiteGeo_Equipement`,  `trafic`,   `NUM_SITE_THEORIQUE2` FROM lister12) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    Ta requête me permet de me passer de la table 'fin'. Malheureusement le résultat pour T10017, 'somme_trafic' est 90 au lieu de 70. Càd que les doublons sont toujours présents!

  9. #9
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 183
    Points : 71
    Points
    71
    Par défaut
    bonjour,
    je pense que tu peux utilisé la solution de Maljuna Kris mais au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from
    select distinct Equipement#
    tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    from
    select distinct SiteGeo_Equipement
    c'est pas la peine d'inclure Equipement# dans la selection.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Si l'on vire la table fin, ça donne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (SELECT DISTINCT `Equipement#`,  `SiteGeo_Equipement`,  `trafic`,   `NUM_SITE_THEORIQUE2` FROM lister12) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    S'il te plaît Maljuna Kris de quoi dépend le choix des champs à inclure dans ta sélection...?

    Citation Envoyé par hypothese Voir le message
    tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from
    select distinct SiteGeo_Equipement
    c'est pas la peine d'inclure Equipement# dans la selection.
    Merci pour ton aide ça marche . Mais de quoi dépend le choix des champs à inclure dans la sélection...?

    Merci à vous!

  11. #11
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par aiss57 Voir le message
    S'il te plaît Maljuna Kris de quoi dépend le choix des champs à inclure dans ta sélection...?
    Apparemment hypothèse serait mieux à même de répondre

    J'ai fait en fonction de ce qui m'apparaissait correspondre à ton cahier des charges en scrutant, du mieux que j'ai pu, la liste de values que tu nous avais fournies.

    DISTINCT opérant sur l'ensemble du n-uplet il faut choisir toutes les colonnes dont tu vas avoir besoin dans la requête finale + celles qui permettent la discrimination sans plus.

    Peut-être, effectivement, que `Equipement#` est de trop, à toi de voir.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Apparemment hypothèse serait mieux à même de répondre

    J'ai fait en fonction de ce qui m'apparaissait correspondre à ton cahier des charges en scrutant, du mieux que j'ai pu, la liste de values que tu nous avais fournies.

    DISTINCT opérant sur l'ensemble du n-uplet il faut choisir toutes les colonnes dont tu vas avoir besoin dans la requête finale + celles qui permettent la discrimination sans plus.

    Peut-être, effectivement, que `Equipement#` est de trop, à toi de voir.
    Merci pour tes explications claires Maljuna Kris.

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

Discussions similaires

  1. Deux count sur même champ avec conditions différentes
    Par steerayInFrance dans le forum Développement
    Réponses: 4
    Dernier message: 14/06/2011, 14h20
  2. [AC-2003] Acess Req Ajout sur 3 champs avec conditions
    Par cbienmoi dans le forum IHM
    Réponses: 1
    Dernier message: 01/09/2009, 20h29
  3. Réponses: 6
    Dernier message: 22/03/2007, 18h34
  4. somme sur champ calculé et table liée
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 06/11/2006, 18h02
  5. Somme de champs sous condition
    Par Nicola dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/08/2006, 14h47

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