我的表格提交如下:
employee_id,
expense_id,
expense_type,
expense_cost,
expense_date and etc,
我希望将特定员工的月度费用显示为明智的费用。 在我的表中数据存储像
2wheeler 01/03/2014 99 Santhosh 4493.00 March 500.00
Auto 03/02/2014 99 Santhosh 0.00 February 80.00
Food 01/02/2014 99 Santhosh 0.00 February 200.00
Phone Expense 01/03/2014 99 Santhosh 0.00 March 500.00
在这张桌子中我想出去 单个用户行与费用类型的连续和每个月的成本总和意味着:3月有单行与费用类型的连续&成本总和。
答案 0 :(得分:0)
我建议做一个子查询,总结每位员工每个费用每月费用的所有发生情况。然后使用它作为来源获取员工列表,月份以及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