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 et SQL. Discussion :

Champ calculé somme de deux champs dans deux tables


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut Champ calculé somme de deux champs dans deux tables
    Bonjour à tous,
    je tourne un peu en rond !
    J'ai trois tables : A, B et C. Dans la table A un champs clef primaire, lié à un champs par une relation un à plusieurs avec les tables B et C.
    Je souhaite afficher dans une zone de liste trois colonnes : une avec la clef primaire, une avec la somme du champs B.a et C.a correspondant à la clef primaire, l'autre avec la somme des champs B.b et C.b correspondant aussi à la clef primaire.
    J'ai essayé de passer par les tableaux croisés, par le "GROUP BY",les champs calculés le tout sans succès malgré les heures passées dessus. La seule solution trouvée à date est de calculer les sommes de chaque table indépendamment, puis de les additionner en remplissant ma zone de liste en mode "liste de valeurs" ; sachant que je souhaite ensuite avoir la possibilité d'afficher un graphique avec ces résultats, et qu'il faut pour cela une source correspondant à une table ou requête, ça ne m'aide pas : il faudrait insérer les résultats dans une table temporaire, la vider et la re-remplir, et recommencer toutes les opérations chaque fois que je veux changer le critère (grouper à partir d'une autre clef primaire)
    Ca fait un peu usine à gaz, et je me demandais si quelqu'un avait une solution plus économe en ressources ?

    En vous remerciant d'avance,

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Bonjour wulfral

    Peux tu charger un jeu de data et donner le résultat attendu?

    Bonjour chez vous
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Bonjour informer,
    ci-joint une table exemple ; je l'ai faite en vitesse sans forcément penser au bien fondé des noms, etc.
    Dans ma base, les "produits" et "services" ne peuvent être regroupés sur une même table : elles sont liées à d'autres tables différentes.
    Dans mon Frmaffichage, "lstresult", je souhaite afficher dans la première colonne soit le nom de toutes les sociétés, ou de tous les types de sociétés ou de tous les types de livraison. Dans la deuxième colonne, la somme (tiré des deux tables donc) attribué à chacun.
    Dans mon exemple, et pour les sociétés, la zone de liste serait remplie ainsi :
    collec1 ; 150
    independant1 ;400
    independant2 ; 100
    interi ; 450
    prodbio1 ; 850

    Une troisième colonne avec les % du total serait un grand plus, mais ça je devrais pouvoir m'en sortir une fois que j'aurais la solution au problème posé !
    Je souhaite avoir ce résultat en passant par une requête plutôt qu'ajouter les valeurs une à une, et en passant donc par plusieurs requêtes, puis devoir les enregistrer pour en sortir une graphique, puis les supprimer et recommencer à chaque fois que l'utilisateur voudra afficher en fonction d'une autre table !

    Merci d'avoir pris le temps de t'intéresser à mon problème,

    exemple.zip

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Bonsoir wulfram


    Je te propose cette solution:

    Création d'une vue = Toutes les opérations Services et produits confondus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT societé, montant
    FROM (SELECT societé, montant
    FROM calcul1
    UNION
    SELECT societé, montant
    FROM calcul2)  AS AllOpe

    Puis une simple requête d'agrégation sur cette vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qrySteAllOpe.societé, Sum(qrySteAllOpe.montant) AS SommeDemontant
    FROM qrySteAllOpe
    GROUP BY qrySteAllOpe.societé;
    Et j'obtiens les résultats suivants

    societé SommeDemontant
    collec1 150
    independant1 400
    independant2 100
    interi 400 -------------------> seul total différent du tien
    prodbio1 850


    Bonjour chez vous
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,
    Vu d'ici ça à l'air plutôt génial, mais je n'avais jamais entendu parler des vues, ni de l'imbrication de "SELECT" dans une même "requête" ;
    Je ne vais malheureusement pas avoir le temps ce soir, mais je me penche sur le problème demain !

    Merci en tout cas, j'ai comme l'impression que ça va résoudre mon problème ! (et alléger une autre partie de mon code si les possibilités sont tels que j'imagine)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Bon en fait j'ai pris le temps de regarder, ce n'était pas si compliqué : la création d'une vue est en fait une simple création de requête...
    J'ai également trouvé comme toi au niveau du résultat, en me penchant un peu sur le pourquoi, j'ai vu qu'il manquait un enregistrement dans la vue ; l'idée m'est venu que ça pouvait venir du montant, et en effet, dans le cas de deux montant identiques (que ce soit dans la même table, ou dans deux tables différentes), un seul des deux enregistrement est pris en compte. Sachant que je risque d'avoir ce cas assez souvent, je vais voir demain si je peux trouver une parade à ce problème. (un numéroauto ne fonctionnera pas, il y a le risque qu'un enregistrement de chaque table ait à la fois une même ID et un même montant !)
    J'imagine que pour ce genre de requête il faut avoir des champs ayant le même nom dans les deux tables ?
    Peut-être rajouter un numéroauto + un champs "nom_table" (ce qui permet de créer une clé primaire composée...)

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Si tu parles de la requête union non et oui. Je m'explique:

    1. Tu dois avoir le même nom d'alias donc non le nom originel dans les tables n'est pas obligatoire le même.
    2. Par contre, le type de données doit être obligatoirement identique pour chaque champs avec le même alias



    Bonjour chez vous
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Pour obtenir les bons résultats, il faut faire l'UNION sur les valeurs agrégées des tables (GROUP BY) et tu obtiendras bien :

    Interi = 450

    Bonjour chez vous
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,
    Merci encore informer, je ne t'avais pas oublié ; j'ai eu d'un côté d'autres préoccupations, et d'un autre j'ai passé du temps à revoir mon code déjà écrit pour l'améliorer grâce aux possibilités découvertes grâce à toi !
    J'ai aussi passé pas mal de temps à ne pas trouver de solution plus simple que celle de passer par... quatre requêtes !
    Voila donc le code que j'utilise pour alimenter ma zone de liste :

    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
    38
    39
    40
    41
        CurrentDb.QueryDefs("Rqtsolde").SQL = "SELECT Tblcompte.nomcompte, Tblcompte.typecompte, Tblcompte.nomintermediaire, Tblcompte.nommonnaie, Tblcompte.nomobjectif, 'solde' AS type, Tblsoldeinitial.soldeinitial AS solde1, [Tblsoldeinitial].[soldeinitial]*[Tblmonnaie].[parite] AS soldeeur1 " & _
                                                "FROM Tblmonnaie " & _
                                                "INNER JOIN (Tblcompte " & _
                                                    "INNER JOIN Tblsoldeinitial " & _
                                                        "ON Tblcompte.nomcompte = Tblsoldeinitial.nomcompte) " & _
                                                    "ON Tblmonnaie.nommonnaie = Tblcompte.nommonnaie " & _
                                                "WHERE (Tblcompte.jourouverture < #" & Format(Me.txtsolde.Value, "yyyy/mm/dd") & "# OR Tblcompte.jourouverture = #" & Format(Me.txtsolde.Value, "yyyy/mm/dd") & "#) "
     
        CurrentDb.QueryDefs("Rqtmouvement").SQL = "SELECT Tblcompte.nomcompte, Tblcompte.typecompte, Tblcompte.nomintermediaire, Tblcompte.nommonnaie, Tblcompte.nomobjectif, Sum(Tblfluxcash.montant) AS mouvement, Sum([Tblfluxcash].[montant]*[Tblmonnaie].[parite]) AS mouvementeur, 'mouvement' AS type " & _
                                                    "FROM Tblmonnaie " & _
                                                    "INNER JOIN (Tblcompte " & _
                                                        "INNER JOIN Tblfluxcash " & _
                                                            "ON Tblcompte.nomcompte = Tblfluxcash.nomcompte) " & _
                                                        "ON Tblmonnaie.nommonnaie = Tblcompte.nommonnaie " & _
                                                    "WHERE (Tblfluxcash.jourop < #" & Format(Me.txtsolde.Value, "yyyy/mm/dd") & "# OR Tblfluxcash.jourop = #" & Format(Me.txtsolde.Value, "yyyy/mm/dd") & "#) " & _
                                                    "GROUP BY Tblcompte.nomcompte, Tblcompte.typecompte, Tblcompte.nomintermediaire, Tblcompte.nommonnaie, Tblcompte.nomobjectif "
     
        CurrentDb.QueryDefs("Rqtsolmouv").SQL = "SELECT Rqtsolde.type, Rqtsolde.nomcompte, Rqtsolde.solde1 AS solde, Rqtsolde.soldeeur1 AS soldeeur " & _
                                                    "FROM Rqtsolde " & _
                                                    "UNION " & _
                                                    "(SELECT Rqtmouvement.type, Rqtmouvement.nomcompte, Rqtmouvement.mouvement AS solde, Rqtmouvement.mouvementeur AS soldeeur " & _
                                                    "FROM Rqtmouvement) "
    Me.lbltotal.Caption = DSum("[soldeeur]", "Rqtsolmouv")
     
    If Me.cbosolde.Value = "Compte" Then
        Me.lsttotal.ColumnCount = 4
        Me.lsttotal.ColumnWidths = "4cm;;;1cm"
        If Me.lbltotal.Caption = 0 Then
            Me.lsttotal.RowSource = "SELECT Rqtsolmouv.nomcompte AS Compte, Sum(Rqtsolmouv.solde) as solde, Sum(Rqtsolmouv.soldeeur) as solde€, 'NA' AS '%'" & _
                                    "FROM Rqtsolmouv " & _
                                    "GROUP BY Rqtsolmouv.nomcompte " & _
                                    "ORDER BY Rqtsolmouv.nomcompte"
            Me.lsttotal.Requery
        Else
            Me.lsttotal.RowSource = "SELECT Rqtsolmouv.nomcompte AS Compte, Sum(Rqtsolmouv.solde) as solde, Sum(Rqtsolmouv.soldeeur) as solde€, 100 / " & Me.lbltotal.Caption & " * Sum(Rqtsolmouv.soldeeur) AS '%'" & _
                                    "FROM Rqtsolmouv " & _
                                    "GROUP BY Rqtsolmouv.nomcompte " & _
                                    "ORDER BY Rqtsolmouv.nomcompte"
            Me.lsttotal.Requery
        End If
    End If
    C'est fonctionnel, probablement pas optimisé, mais j'y ai déjà passé assez de temps ; je reviendrais dessus si par la suite, en cherchant la solution à un autre problème, j'entrevois la possibilité de faire mieux !
    Merci encore à toi informer pour le temps passé

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

Discussions similaires

  1. champ calculé d'après 2 champs calculé
    Par lambac dans le forum IHM
    Réponses: 11
    Dernier message: 05/03/2009, 09h22
  2. Fractionner cellule excel dans deux champs
    Par wachoo31 dans le forum Modélisation
    Réponses: 4
    Dernier message: 17/07/2008, 09h06
  3. maximum dans deux champs
    Par Dohmaker dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 15/10/2007, 20h48
  4. recherche dans deux champs
    Par schwarzy2 dans le forum Access
    Réponses: 2
    Dernier message: 10/04/2007, 17h09
  5. Somme sur un champ calculé dans un état
    Par Format dans le forum IHM
    Réponses: 5
    Dernier message: 28/11/2006, 14h21

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