如何将group_concat与group by一起使用?

时间:2014-05-29 09:47:23

标签: mysql

我的表格提交如下:

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月有单行与费用类型的连续&成本总和。

1 个答案:

答案 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