Maison  >  Questions et réponses  >  le corps du texte

Regrouper par plusieurs champs après la jointure SQL

J'ai écrit la requête suivante qui joint correctement deux tableaux montrant le nombre de tâches accomplies par les individus de l'équipe et les coûts associés à ces tâches :

SELECT users.id AS user_id, 
users.name, 
COALESCE(tasks.cost, 0) AS cost,
tasks.assignee,
tasks.completed,
tasks.completed_by
FROM users
JOIN tasks
ON tasks.assignee = users.id
WHERE completed IS NOT NULL AND assignee IS NOT NULL

Cela donne le tableau suivant :

ID utilisateur Nom Cessionnaire Coût Terminé Heure de réalisation
18 Mike 8 0,25 2022-01-24 19:54:48 8
13 Katie 13 0 2022-01-24 19:55:18 8
13 Katie 13 0 2022-01-25 11:49:53 8
12 Jim 12 0,5 2022-01-25 11:50:02 12
9 Oli 9 0,25 2022-03-03 02:38:41 9

Je souhaite maintenant aller plus loin et retrouver le coût total regroupé par nom et mois réalisé. Cependant, je n'arrive pas à comprendre la syntaxe du GROUP BY après les clauses select et WHERE actuelles. En fin de compte, je veux que la requête renvoie quelque chose comme ceci :

Nom cost_sum mois
Mike 62 Janvier
Katie 20 Janvier
Jim 15 Janvier
Oli 45 Janvier
Mike 17 Février

J'ai essayé diverses combinaisons et clauses GROUP BY imbriquées, mais je n'arrive pas à obtenir les résultats souhaités. Tous les indicateurs seraient grandement appréciés.

P粉616383625P粉616383625182 Il y a quelques jours404

répondre à tous(2)je répondrai

  • P粉883278265

    P粉8832782652024-04-04 11:06:54

    Ça ressemble à ça :

    SELECT users.name, tasks.completed_by month, sum(COALESCE(tasks.cost, 0)) cost_sum
    FROM users
    JOIN tasks
    ON tasks.assignee = users.id
    WHERE completed IS NOT NULL AND assignee IS NOT NULL
    group by users.name, tasks.completed_by

    répondre
    0
  • P粉674999420

    P粉6749994202024-04-04 10:34:09

    Concatène users 加入一个查询,该查询聚合在 tasks et renvoie le coût mensuel total pour une année spécifique :

    SELECT u.name, 
           COALESCE(t.cost, 0) AS cost,
           DATE_FORMAT(t.last_day, '%M')
    FROM users u
    INNER JOIN (
      SELECT assignee, LAST_DAY(completed) last_day, SUM(cost) AS cost
      FROM tasks
      WHERE YEAR(completed) = 2022
      GROUP BY assignee, last_day
    ) t ON t.assignee = u.id
    ORDER BY t.last_day;

    Pas besoin de vérifier completednull还是assigneenull,因为nulls sont filtrés ici :

    WHERE YEAR(completed) = 2022

    Ici :

    ON t.assignee = u.id

    répondre
    0
  • Annulerrépondre