Heim  >  Fragen und Antworten  >  Hauptteil

Gruppieren Sie nach mehreren Feldern nach dem SQL-Join

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粉616383625P粉616383625182 Tage vor403

Antworte allen(2)Ich werde antworten

  • P粉883278265

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

    大概是这样的:

    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

    Antwort
    0
  • P粉674999420

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

    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

    Antwort
    0
  • StornierenAntwort