Regrouper par plusieurs champs après la jointure SQL
P粉616383625
P粉616383625 2024-04-03 12:25:01
0
2
456

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粉616383625
P粉616383625

répondre à tous(2)
P粉883278265

Ç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
P粉674999420

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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal