Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mauvaise addition de résultats

Sujet résolu
    16 septembre 2021 à 14:37:12

    Bonjour,

    J'ai pour cet exemple demandé par une petite assoc' sportive 3 tables :

    - seances : ID, nom, date

    - seances_contrats : seances_id, presence_debut, presence_fin, contrats_previ_id

    - contrats_previs : ID, coutHoraire

    Je souhaite avoir un coût par date.
    Pour ça il faut que (par date donc) je multiplie la durée de présence d'un "seances_contrats" avec le coût du "contrats_previs" correspondant.
    Je peux bien sur avoir plusieurs enregistrements "seances_contrats" sur une seule et même "seance".

    Voici la requête que je fais pour ça:

    SELECT
                s.date,
                (SELECT
                    SUM(cast(time_to_sec(timediff(sc.presence_fin, sc.presence_debut)) / (60 * 60) as decimal(10, 1))) * cp.cout
                ) AS finance
            FROM
                seances s
            INNER JOIN
                seances_contrats sc ON sc.seances_id = s.id
            INNER JOIN
                contrats_previ cp on sc.contrats_previ_id = cp.id
            GROUP BY
                s.date
            ORDER BY
                s.date

    Problème, si j'ai plusieurs "seances_contrats" sur une "seance", alors le résultat "finance" n'est pas bon, il se contente de me donner un des coûts présents sur la séance avec le nombre de "seances_contrats" présents.

    Par exemple, j'ai 2 "seances_contrats" sur une "seance":
    - 1 : durée de 3.5h avec un cout horaire de 11€
    - 2 : durée de 3.5h avec un coût horaire de 20€

    Eh bien il va me sortir comme résultat 140€, soit 3.5*20*2, alors que je devrais avoir 108.5€ comme résultat.

    Si j'ajoute "cp.id" dans le GROUP BY, alors le détail me sort bien les 2 coûts corrects (70 et 38.5).

    Bref, j'espère être clair dans les explications, et merci par avance pour votre aide, je tourne en rond depuis quelque temps...
    Merci  :)

    ***************************

    Je me réponds à moi-même après avoir trouvé la solution (pas faute d'avoir chercher x temps avant mais bon......).

    Bref, ma multiplication n'était juste pas placée au bon endroit dans ma sous-requête, la honte...

    La réponse si d'autres personnes se trouvent dans le même cas un jour :

    SELECT
                s.date,
                (SELECT
                    SUM(cast(time_to_sec(timediff(sc.presence_fin, sc.presence_debut)) / (60 * 60) as decimal(10, 1)) * cp.cout)
                ) AS finance
            FROM
                seances s
            INNER JOIN
                seances_contrats sc ON sc.seances_id = s.id
            INNER JOIN
                contrats_previ cp on sc.contrats_previ_id = cp.id
            GROUP BY
                s.date
            ORDER BY
                s.date

    -
    Edité par jouvrard 16 septembre 2021 à 15:09:00

    • Partager sur Facebook
    • Partager sur Twitter

    Mauvaise addition de résultats

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown