我建议做一个子查询来总结每个员工每月每笔费用的所有费用。然后将其用作获取员工列表、月份和 GROUP_CONCATed 费用类型列表以及它们的总成本的来源。
像这样:-
SELECT employee_id, expense_month, GROUP_CONCAT(CONCAT_WS('=', expense_type, monthly_exployee_expense))
FROM
(
SELECT employee_id, MONTH(expense_date) AS expense_month, expense_type, SUM(expense_cost) AS monthly_exployee_expense
FROM some_table
GROUP BY employee_id, expense_month, expense_type
) Sub1
GROUP BY employee_id, expense_month
编辑
阅读您的评论,您似乎需要列出一笔费用,即使员工当月没有支付该费用。
为此,我认为您需要将员工(我假设表名称为 tbl_employee)与费用类型表以及所有可能的月份交叉连接(假设您需要一个月的一行)当该员工当月没有任何费用时)。通过从列出所有费用的表格中选择不同的年份/月份,我得到了可能的月份(但还有其他方法可以得到这个 - 取决于是否有任何月份没有员工有任何费用,如果你想把这些反正出去)。
一旦它们被交叉连接以获得员工、月份和费用的每个组合,您就可以在子查询中加入实际费用,然后像以前一样执行 GROUP_CONCAT。
未测试,但类似这样:-
SELECT employee_id, expense_month, GROUP_CONCAT(CONCAT_WS('=', exp_type_text, monthly_exployee_expense))
FROM
(
SELECT tbl_employee.employee_id, expense_months.expense_month, tbl_expense_type.exp_type_id, tbl_expense_type.exp_type_text, SUM(expense_cost) AS monthly_exployee_expense
FROM tbl_employee
CROSS JOIN tbl_expense_type
CROSS JOIN
(
SELECT DISTINCT DATE_FORMAT(expense_date, '%Y%m') AS expense_month
FROM some_table
) expense_months
LEFT OUTER JOIN some_table
ON tbl_employee.employee_id = some_table.employee_id
AND tbl_expense_type.exp_type_id = some_table.expense_type
AND expense_months.expense_month = DATE_FORMAT(some_table.expense_date, '%Y%m')
GROUP BY tbl_employee.employee_id, expense_months.expense_month, tbl_expense_type.exp_type_id, tbl_expense_type.exp_type_text
) Sub1
GROUP BY employee_id, expense_month