cari

Rumah  >  Soal Jawab  >  teks badan

Himpunkan mengikut berbilang medan selepas gabungan SQL

Saya menulis pertanyaan berikut yang menggabungkan dua jadual dengan betul yang menunjukkan bilangan tugasan yang disiapkan oleh individu dalam pasukan dan kos berkaitan tugasan tersebut:

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

Ini menyediakan jadual berikut:

ID Pengguna Nama Penerima tugas Kos Selesai Masa siap
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

Saya kini ingin pergi lebih jauh dan mencari jumlah kos yang dikumpulkan mengikut nama dan bulan selesai. Walau bagaimanapun, saya tidak dapat memikirkan sintaks untuk GROUP BY selepas klausa pilih dan WHERE semasa. Akhirnya, saya mahu pertanyaan mengembalikan sesuatu seperti ini:

Nama jumlah_kos bulan
Mike 62 Januari
Katie 20 Januari
Jim 15 Januari
Oli 45 Januari
Mike 17 Februari

Saya telah mencuba pelbagai kombinasi dan klausa GROUP BY bersarang tetapi nampaknya tidak dapat hasil yang saya inginkan. Sebarang petunjuk akan amat dihargai.

P粉616383625P粉616383625230 hari yang lalu461

membalas semua(2)saya akan balas

  • P粉883278265

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

    Ia kelihatan seperti ini:

    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

    balas
    0
  • P粉674999420

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

    Menggabungkan users 加入一个查询,该查询聚合在 tasks dan mengembalikan jumlah kos bulanan untuk tahun tertentu:

    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;

    Tidak perlu menyemak completednull还是assigneenull,因为nulls ditapis di sini:

    WHERE YEAR(completed) = 2022

    Di sini:

    ON t.assignee = u.id

    balas
    0
  • Batalbalas