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 sur T1 depuis T2 + T3


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut SUM sur T1 depuis T2 + T3
    Bonjour !

    J'ai 3 tables avec notamment ces caractéristiques :

    T1
    ------
    id
    prix
    t2_id
    t3_id


    T2
    ------
    id
    t3_id


    T3
    ------
    id


    J'ai besoin de récupérer une SUM de prix de T1. Pour l'instant, je peux faire la SUM en faisant une jointure entre T1 et T2, et une autre entre T1 et T3 avec une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sum(T1.prix)
    FROM T1
    join T2 on T1.t2_id = T2.id
    WHERE T2.id = 'xxx'
    Maintenant, j'aimerais rapporter directement la SUM en une seule requête, ET en évitant les doublons ou les oublis
    J'étais parti sur des left join, mais comme je n'y arrivais pas j'ai essayé avec un cross join, mais comme je n'y arrivais pas je suis venu ici

    J'y suis depuis un moment, et je patauge un peu... Aussi merci d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    en l’état vous avez certainement trop simplifié votre problème, car je ne vois pas l’intérêt des jointure sur T2 et T3...


    Sur le principe, vous pouvez faire des FULL OUTER JOIN. en supposant que id sont les clefs primaires, vous ne devriez pas avoir dédoublonnage des ligne et vos sommes devraient être correctes. Dans le cas contraire, il faudra faire les jointures sur des sous requêtes faisant les regroupements

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Merci de m'aider !

    J'ai effectivement simplifié : bien vu !
    En fait, j'ai pas mal de tables avec de l'héritage. Ces 3 tables sont en bout de recherche, et je dois faire plusieurs jointures pour y parvenir.
    En fait, je pourrais rajouter T4 :
    T4
    ----
    id
    t3_id
    t2_id

    L'id de T4 est également dans T2 et T3... Du coup, pour atteindre T1 depuis T3, je peux faire :
    T2.t1_id = T1.id
    T2.t3_id = T2.id, puis T2.t1_id = T1.id
    T2.t4_id = T4.id, puis T4.id = T3.t4_id, puis T3.id = T1.t3_id

    D'où ma simplification
    Je te passe les détails avant T3 !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Salut!

    Je n'ai pas reussi à comprendre qu'est-ce que vous voulez exatement.
    Quelles sont les situations que vous voulez sommer le PRIX de la table 1?

    Toutefois si vous avez deux ou plusieurs sources , probablement vous devez utiliser le UNION et puis faire la SUM.

    OBS: Je suis en train d'étudier le français, alors pardonnez moi quelque chose.

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SUM(T1.prix)
    FROM T1, T2, T3
    WHERE  
    (T1.t2_id = T2.id OR T1.t3_id = T3.id)
    AND t2.id = "xx"
    AND t3.id = "yy"

    Cela ne fonctionnerait pas?

    Désolé pour l'absence de JOIN, je ne suis pas encore très familiarisé avec leurs utilisations

  6. #6
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Je besoin de quelques information:

    Dans la table1, t2_id et t3_id est NULL ou NOT NULL?
    Dans la table2 , t3_id est NULL ou NOT NULL?

    Si tu veux les donnés t2.id = "xx" ou t3.id = "yy" ça marchera seulement s'ils sont obligatoires, c'est à dire NOT NULL.

    Si possible, tu pourrais donner quelques exemples des donnés dans chaque table pour que je puisse meilleur comprendre?

  7. #7
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par DanielNobre Voir le message
    Je besoin de quelques information:

    Dans la table1, t2_id et t3_id est NULL ou NOT NULL?
    Dans la table2 , t3_id est NULL ou NOT NULL?

    Si tu veux les donnés t2.id = "xx" ou t3.id = "yy" ça marchera seulement s'ils sont obligatoires, c'est à dire NOT NULL.

    Si possible, tu pourrais donner quelques exemples des donnés dans chaque table pour que je puisse meilleur comprendre?
    Un id ne peut pas être NULL.

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Un id ne peut pas être NULL.
    Dans le cas évoqué par DanielNobre, à savoir une clef étrangère, la colonne peut tout à fait être nullable.

  9. #9
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Dans le cas évoqué par DanielNobre, à savoir une clef étrangère, la colonne peut tout à fait être nullable.
    La condition suivante filtre sur les IDs de T1 présents en clef étrangère dans T2 ou T3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE  
    (T1.t2_id = T2.id OR T1.t3_id = T3.id)
    Donc si je comprend bien ta remarque, cela voudrait dire que T2.t1_id ou T3.t1_id pourraient être NULL?

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    cela voudrait dire que T2.t1_id ou T3.t1_id pourraient être NULL?

    dans la table oui. Par contre en effet, ils ne passeraient alors pas le filtre.

  11. #11
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    dans la table oui. Par contre en effet, ils ne passeraient alors pas le filtre.
    Petite question hors sujet du coup : si on accepte un clef étrangère NULL, ne serait-il pas préférable d'utiliser un table de liaison plutôt?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Petite question hors sujet du coup : si on accepte un clef étrangère NULL, ne serait-il pas préférable d'utiliser un table de liaison plutôt?
    C'est complètement possible d'avoir une clef étrangère permettant NULL. Je n'ai pas compris pourquoi avoir le t2_ID et t3_ID dans la table1 si dans la table2 possède le t3_ID, donc dans la table1 devrais avoir seulement le t2_ID, pas le t3_ID. C'est le plus logique sans savoir le type de donnés que les table représentent.

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    si on accepte un clef étrangère NULL, ne serait-il pas préférable d'utiliser un table de liaison plutôt?
    La question fait débat, surtout pour une multiplicité 0..1.
    Certains diront qu'il faut dans cas une table associative. D'autres mettront une clef étrangère nullable.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    La question fait débat, surtout pour une multiplicité 0..1.
    Certains diront qu'il faut dans cas une table associative. D'autres mettront une clef étrangère nullable.
    Pardonnez moi, je ne suis pas habitué à certaines expressions en français et aussi c'est un peu hors de question mais quelle est la difference entre une table associative et une table de liason?

  15. #15
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par DanielNobre Voir le message
    quelle est la difference entre une table associative et une table de liason?

    A part le nom... aucune

  16. #16
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bonjour à tous !!!

    Je suis désolé de ne pas être revenu plus tôt, mais j'avais de gros problèmes de connexions avec à chaque fois un message d'erreur du type "donnée manquante pour le champ suivant : ip" ?!
    J'avais même essayé de poster plusieurs fois mon message et je ne le voyais jamais...

    Je suis heureux de voir qu'autant de monde est passé en mon absence
    Entre temps, j'ai eu plus d'information sur les champs nullables des tables et, du coup, ça simplifie grandement mon problème :


    T1
    ------
    id
    prix
    date
    t2_id XOR avec t3_id, nullable
    t3_id XOR avec t2_id, nullable


    T2
    ------
    id
    t3_id XOR avec t4_id, nullable
    t4_id XOR avec t3_id, nullable


    T3
    ------
    id
    t2_id nullable
    t4_id nullable

    T4
    ----
    id
    t3_id
    t2_id

    Je veux donc récupérer, pour T1, la SUM(prix) et la date, soit :
    - depuis T2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select sum(TI.prix), T1.date
     
    from T1
     
    where T1.t2_id = '?1'
     
    group T1.date;
    - depuis T4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select sum(T1.prix), T1.date
     
    from T1
    join T2 on T1.t2_id = T2.id.id
    join T4 on T2.t4_id = T4.id
     
    where T4.id = '?1'
     
    group T1.date;
    - et depuis T3 (la plus compliquée pour moi), il faudrait faire un mix des 2 précédentes avec celle la, permettant de rechercher directement depuis T3 vers T1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select sum(TI.prix), T1.date
     
    from T1
     
    where T1.t3_id = '?1'
     
    group T1.date;
    J'espère avoir pu apporter assez d'éléments

    Merci encore !!!

  17. #17
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Je trouve très étrange que la table4 ait le t2_ID et le t3_ID, et que la table2 et la table3 aient le t4_ID. Il y a quelque chose mal là, pour moi.

    Mais, grossièrement vous pourriez faire cela (J'ai fait la SUM seulement au fin de toutes les requêtes internes):

    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
    SELECT SUM(T.prix) PRIX
          ,T.DATE
    FROM (      
    SELECT ti.prix
          ,t1.DATE
      FROM t1
     WHERE t1.t2_id = '?1'
     
    UNION ALL
     
    SELECT t1.prix
          ,t1.DATE
      FROM t1
      JOIN t2 ON t1.t2_id = t2.id.id
      JOIN t4 ON t2.t4_id = t4.id
     WHERE t4.id = '?1'
     
    UNION ALL
     
    SELECT ti.prix
          ,t1.DATE
      FROM t1
     WHERE t1.t3_id = '?1' 
     ) T
    GROUP BY T.DATE
    Mais est possible que les requête aient quelques lignes dupliqués parce que les liasons provenant de la table4 passent pour la table2 ou la table3 et celles-ci sont dejà liées à la table. Donc , peut-être, on doit faire comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /*requête de la table2*/     
    SELECT ti.prix
          ,t1.DATE
      FROM t1
     WHERE t1.t2_id = '?1'
       and t2.t4_id is null /*  supprimer les lignes provenant de la table4*;

  18. #18
    Nouveau membre du Club
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    En fait, il y a des relations 1n :

    T2 1------n T1

    T3 1------n T2
    T3 1------n T4
    T3 1------n T1

    T4 1------n T2

    Voila l'explication

Discussions similaires

  1. Réponses: 18
    Dernier message: 06/10/2007, 19h03
  2. Utilisation de SUM() sur des 'real'
    Par f.le.chat dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/06/2006, 16h16
  3. SUM sur un ENUM
    Par megane dans le forum Langage SQL
    Réponses: 11
    Dernier message: 15/05/2006, 17h57
  4. photo sur état depuis cadre d'objet
    Par Ps4 dans le forum Access
    Réponses: 2
    Dernier message: 23/09/2005, 11h58
  5. Sum sur un champ Time
    Par Régent dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/02/2005, 00h39

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