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
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.