Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sommes conditionnelles et group by

Sujet résolu
    2 février 2021 à 16:41:37

    Bonjour,

    L'idée générale est de faire un total des coûts de contrats avec un cout moyen corrigé facultatif, dans lesquels se trouvent des prévisionnels avec pour chacun un nombre d'heures ainsi qu'un coût horaire, le tout groupé par mois.

    En gros, avec juste les champs utiles:

    contrats (c) : ID(pk), date_signature, coutMoyenCorrige

    contrats_previ (cp) : ID(pk), contrats_id(fk), heures, cout

    Un contrat peu donc avoir plusieurs prévisionnels, et peut avoir un coût moyen corrigé ou non (valeur NULL dans ce cas).
    Et donc comme dit plus haut, je souhaite obtenir la somme des prévisionnels des contrats, par mois, avec:
    - Si contrats a un cout moyen corrigé, alors la somme pour celui-ci sera le c.coutMoyenCorrigé * cp.heures
    - Si contrats n'a pas de cout moyen corrigé, alors la somme pour celui-ci sera cp.cout * cp.heures

    Pour info ma requête, qui bien sûre n'est pas bonne:

    SELECT
                        MONTH(c.date_signature),
                        MONTHNAME(c.date_signature),
                        IF(ISNULL(c.coutMoyenCorrige), SUM(cp.cout * cp.heures), SUM(c.coutMoyenCorrige * cp.heures)) AS cout
                    FROM contrats c
                    INNER JOIN
                        contrats_previ cp on c.id = cp.contrats_id
                    WHERE
                        date_signature BETWEEN :debut AND :fin
                    GROUP BY
                        MONTH(c.date_signature)

    Là, il se base uniquement sur le premier enregistrement qu'il trouve.
    Je suis en train d'essayer avec une sous-requête mais pour le moment sans résultat...

    Par avance, merci !

    -
    Edité par jouvrard 2 février 2021 à 16:46:21

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2021 à 17:57:04

      Bonjour,

      jouvrard a écrit:

      Là, il se base uniquement sur le premier enregistrement qu'il trouve

      Je ne comprends pas ce que tu veux dire ... Peux-tu poster un exemple ?

      Au passage, tu peux simplifier ton calcul avec COALESCE :

      SELECT
      	MONTH( c.date_signature ) AS mois_num,
      	MONTHNAME( c.date_signature ) AS mois_nom,
      	SUM( COALESCE( c.coutMoyenCorrige, cp.cout ) * cp.heures ) AS cout
      FROM
      	contrats c
      		INNER JOIN contrats_previ cp
      			on c.id = cp.contrats_id
      WHERE c.date_signature BETWEEN :debut AND :fin
      GROUP BY
      	MONTH( c.date_signature ),
      	MONTHNAME( c.date_signature )
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        3 février 2021 à 8:51:50

        Hé bien avec COALESCE ça a l'air de fonctionner, ça ne fait donc pas que simplifier le calcul... :)

        Encore une fois merci beaucoup, tu es un habitué des réponses à mes questions sur ce forum.

        -
        Edité par jouvrard 3 février 2021 à 8:58:53

        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2021 à 9:59:32

          La syntaxe avec COALESCE est vraiment équivalente à celle que tu avais avant ...

          La seule chose vraiment différente c'est la mention complète du GROUP BY, que je t'engage à respecter systématiquement. Ici tu as deux colonnes de regroupement le numéro du mois et son nom, donc il faut les préciser au GROUP BY même si cela semble inutile.

          Juste un petit peu de lecture pour éclaircir : http://cedric-duprez.developpez.com/tutoriels/mysql/demythifier-group-by/

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            3 février 2021 à 10:18:10

            Ok merci, je vais essayer avec mon ancienne requête en ajoutant le second GROUP BY pour voir, je pensais vraiment que c'était inutile en effet.

            Je vais aller voir l'adresse que tu donnes et j'ai aussi télécharger le guide de conception BDD que tu as mis en signature, ça va me faire un peu de lecture!

            • Partager sur Facebook
            • Partager sur Twitter

            Sommes conditionnelles et group by

            × 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