Gruppieren Sie nach mehreren Feldern nach dem SQL-Join
P粉616383625
P粉616383625 2024-04-03 12:25:01
0
2
454

Ich habe die folgende Abfrage geschrieben, die zwei Tabellen korrekt verknüpft, die die Anzahl der von Einzelpersonen im Team erledigten Aufgaben und die damit verbundenen Kosten dieser Aufgaben anzeigen:

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

Dies liefert die folgende Tabelle:

Benutzer-ID Name Beauftragter Kosten Abgeschlossen Fertigstellungszeit
18 Mike 8 0,25 24.01.2022 19:54:48 8
13 Katie 13 0 24.01.2022 19:55:18 8
13 Katie 13 0 25.01.2022 11:49:53 8
12 Jim 12 0,5 25.01.2022 11:50:02 12
9 Oli 9 0,25 2022-03-03 02:38:41 9

Ich möchte jetzt noch einen Schritt weiter gehen und die Gesamtkosten gruppiert nach Name und abgeschlossenem Monat ermitteln. Allerdings kann ich die Syntax für GROUP BY nach den aktuellen select- und WHERE-Klauseln nicht herausfinden. Letztendlich möchte ich, dass die Abfrage etwa Folgendes zurückgibt:

Name Kostensumme Monat
Mike 62 Januar
Katie 20 Januar
Jim 15 Januar
Oli 45 Januar
Mike 17 Februar

Ich habe verschiedene Kombinationen und verschachtelte GROUP BY-Klauseln ausprobiert, kann aber scheinbar nicht die gewünschten Ergebnisse erzielen. Für Hinweise wäre ich sehr dankbar.

P粉616383625
P粉616383625

Antworte allen(2)
P粉883278265

大概是这样的:

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

users 加入一个查询,该查询聚合在 tasks 中并返回特定年份每月的总成本:

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;

不需要检查completednull还是assigneenull,因为nulls在这里被过滤掉了:

WHERE YEAR(completed) = 2022

这里:

ON t.assignee = u.id
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage