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

Développement SQL Server Discussion :

SUM sur plusieurs tables


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut SUM sur plusieurs tables
    Bonjour,

    Je développe une application et je souhaiterais indiquer le nombre d'heures que le salarié a passé sur une machine de production après sa déclaration. J'ai 3 formulaires donc 3 insertions dans des tables différentes et je souhaiterais faire la somme de 3 champs dans des tables différentes. J'ai essayé ma requête mais celle-ci me retourne de mauvaises valeurs c'est pourquoi je me tourne vers vous.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUM(MOD_DMO.Tpsmo + MOD_AccomRecou.TpsMo + MOD_Travail.TempsMo ) AS cumul_journalier
    FROM MOD_DMO
    JOIN MOD_AccomRecou on MOD_DMO.Operateur = MOD_AccomRecou.Operateur
    JOIN MOD_Travail  on MOD_DMO.Operateur = MOD_Travail.operateur
    WHERE MOD_DMO.Operateur = '60216004' /** matricule de l'operateur**/
    AND MOD_DMO.Dates='03/01/2017' /**date de la saisie**/
    Merci d’avance

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    Ton opérateur '60216004' a des valeurs dans les 3 tables, en faisant ta jointure tu fais la somme sur le produit cartésien des trois tables. Tu dois avoir une plus grande valeur que prévu

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Utilisez UNION ALL pour concaténer les durées des différentes tables et faites la somme sur la table dérivée résultante.

    REMARQUE : le fait de trouver des durées à cumuler dans trois tables différentes montre à l'évidence un défaut de modélisation.

    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/ * * * * *

  4. #4
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    Bonjour,

    merci pour votre réponse , oui effectivement l’opérateur est présent dans deux tables. Sachant qu'il peut être présent dans les trois tables ou dans qu'une seule table. Quand j’exécute ma requête sql server me retourne null alors qu'il existe bien des valeurs dans deux table.

    Merci de votre aide

    Nom : sum.PNG
Affichages : 3320
Taille : 14,6 Ko

    table 1:
    Nom : table1.PNG
Affichages : 2440
Taille : 3,6 Ko

    table2:
    Nom : table2.PNG
Affichages : 2423
Taille : 4,0 Ko

  5. #5
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    merci de votre réponse SQLpro , je vais regarder avec UNION ALL.

  6. #6
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    Mais comment créer une table dérivée ou avez vous une syntaxe ? avec ma requête j'ai réussi à sélectionner ce que je voulais mais comment faire mon sum ?

    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MOD_DMO.Dates,MOD_DMO.Operateur,MOD_DMO.Tpsmo  from MOD_DMO where Operateur='60012000' and Dates='04/01/2017'
    union all 
    SELECT MOD_AccomRecou.Dates,MOD_AccomRecou.Operateur,MOD_AccomRecou.TpsMo from MOD_AccomRecou where Operateur='60012000' and Dates='04/01/2017'
    union all 
    SELECT MOD_Travail.Dates, MOD_Travail.Operateur,MOD_Travail.TempsMo from MOD_Travail where Operateur='60012000' and Dates='04/01/2017'
    SELECT SUM() as cumul_journalier

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    c'est sûr qu'en faisant : SELECT SUM() as cumul_journalier tu auras beaucoup de valeurs

    tu peux faire la somme dans chacune de tes tables et ensuite faire une jointure entre les résultats de tes trois requêtes.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select operateur, sum(TempsMo) as temps1
    from table1
    group by operateur
    Tu fais la même chose avec les autres tables ensuite tu fais une jointure avec le résultat comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select temps1 + temps2 + coalesce(temps3, 0)
    from
    (
    ...
    ) req1 join 
     (
    ...
    ) req2 on req1.operateur=req2.operateur
    left join 
    (
    ...
    ) req3 on req1.operateur=req3.operateur
    where req1.operateur='60012000'

    Tu as compris qu'il fallait mettre l'exemple de requête dans les ...

  8. #8
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    c'est sûr qu'en faisant : SELECT SUM() as cumul_journalier tu auras beaucoup de valeurs
    c'est fait exprès puisque je ne sais pas comment faire après, je ne peux pas faire de calcul sur un résultat de requête^^.

    je vais essayer de cette manière je n'y ai pas penser.

    Merci

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    tu n'as pas vu le smiley, je plaisantais, un peu d'humour ça ne tue pas

    tu as compris au moins pourquoi j'ai mis un coalesce et un left join?

  10. #10
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    j'ai rigolais quand j'ai vu ton commentaire, je suis le premier à rire ^^. Est heureusement qu'il y a l'humour

    Pour coalesce c'est pour les champs null il me semble et left join c'est pour la jointure cela permet de récupérer les valeurs associées il me semble...corrige moi si j'ai tord.

    Je voudrais mettre la date comme paramètre mais le calcul et faux donc je doit me tromper.

    merci

    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
    SELECT temps1 + temps2 + coalesce(temps3,0)
    FROM
    (SELECT MOD_DMO.Dates, MOD_DMO.operateur, SUM(Tpsmo) AS temps1
    FROM MOD_DMO
    GROUP BY operateur,Dates
    )req1 join
    (SELECT MOD_AccomRecou.operateur, SUM(Tpsmo) AS temps2
    FROM MOD_AccomRecou
    GROUP BY operateur
    )req2 on req1.Operateur=req2.Operateur
    left join
    (SELECT MOD_Travail.operateur, SUM(TempsMo) AS temps3
    FROM MOD_Travail
    GROUP BY operateur
    )req3 on req1.operateur=req3.operateur
    where req1.operateur='60012000'
    and req1.Dates='04/01/2017'

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    c'est pareil que pour l'operateur, est-ce que tu as une date dans toutes tes tables ?

    il faut ajouter les dates dans toutes les sous requêtes ensuite dans tes jointures mettre :

    on req1.Operateur = req2.Operateur
    and req1.Dates = req2.Dates

  12. #12
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    Oui il y a une date dans toutes mes tables

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Pas besoin de jointure, utilisez simplement UNION ALL
    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
    select sum(tps) as cumul_journalier
      from (
    SELECT MOD_DMO.Tpsmo as tps
      from MOD_DMO 
     where Operateur='60012000' 
       and Dates='04/01/2017'
     union all 
    SELECT MOD_AccomRecou.TpsMo as tps
      from MOD_AccomRecou 
     where Operateur='60012000' 
       and Dates='04/01/2017'
     union all 
    SELECT MOD_Travail.TempsMo as tps
      from MOD_Travail 
     where Operateur='60012000' 
       and Dates='04/01/2017'
           )

  14. #14
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    merci pour votre aide skuatamad mais quand je fait votre requete il me dit " Incorrect syntax near ')'. " je ne vois pas le proble , de plus il me surligne " sum(tps) " non de colonne non valide.

    rastaquare, la requête que je fait fonctionne mais bizarrement pas tout le temps.
    voici ma requête et la capture d’écran
    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
     
    SELECT MOD_DMO.operateur, SUM(Tpsmo) AS temps1
    FROM MOD_DMO
    GROUP BY operateur
     
    SELECT MOD_AccomRecou.operateur, SUM(Tpsmo) AS temps2
    FROM MOD_AccomRecou
    GROUP BY operateur
     
    SELECT MOD_Travail.operateur, SUM(TempsMo) AS temps3
    FROM MOD_Travail
    GROUP BY operateur
     
     
    SELECT temps1 + temps2 + coalesce(temps3,0)
    FROM
    (SELECT MOD_DMO.Dates, MOD_DMO.operateur, SUM(Tpsmo) AS temps1
    FROM MOD_DMO
    GROUP BY operateur,Dates
    )req1 join 
    (SELECT MOD_AccomRecou.Dates,MOD_AccomRecou.operateur, SUM(Tpsmo) AS temps2
    FROM MOD_AccomRecou
    GROUP BY operateur,Dates
    )req2 on req1.Operateur=req2.Operateur and req1.Dates = req2.Dates 
    left join
    (SELECT MOD_Travail.Dates, MOD_Travail.operateur, SUM(TempsMo) AS temps3
    FROM MOD_Travail
    GROUP BY operateur,Dates
    )req3 on req1.operateur=req3.operateur and req1.Operateur=req2.Operateur and req1.Dates = req3.Dates 
    where req1.operateur='60216004'
    and req1.Dates='16/12/2016'
    Nom : Capture.PNG
Affichages : 2454
Taille : 15,6 Ko

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Il manque juste un alias de table final ...

    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
    SELECT SUM(tps) as cumul_journalier
      from (
    SELECT MOD_DMO.Tpsmo as tps
      from MOD_DMO 
     where Operateur='60012000' 
       and Dates='04/01/2017'
     union all 
    SELECT MOD_AccomRecou.TpsMo as tps
      from MOD_AccomRecou 
     where Operateur='60012000' 
       and Dates='04/01/2017'
     union all 
    SELECT MOD_Travail.TempsMo as tps
      from MOD_Travail 
     where Operateur='60012000' 
       and Dates='04/01/2017'
           ) AS T
    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/ * * * * *

  16. #16
    Membre confirmé Avatar de Alex1407
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 166
    Par défaut
    Super cela fonctionne maintenant

    Merci beaucoup

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

Discussions similaires

  1. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54
  2. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  3. order by sur plusieurs tables
    Par Mad_Max dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2003, 12h17
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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