Mysql 如何将group concat与group by一起使用?
我的表格如下所示:Mysql 如何将group concat与group by一起使用?,mysql,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
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
在这张桌子上,我想出去
具有每月费用类型和费用总额的单用户行,这意味着:三月具有具有费用类型和费用总额的单用户行。我建议执行子查询,汇总每个员工每月每项费用的所有费用发生情况。然后将其作为一个来源,以获取员工列表、月数、集团相关费用类型列表及其总成本 像这样:-
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
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
编辑
阅读您的评论,您似乎需要列出一项费用,即使员工当月未发生该费用
要做到这一点,我认为您需要将员工(我假设表名为tbl_employee)与费用类型表以及所有可能的月份交叉连接起来(假设您希望在员工当月没有费用的情况下为该员工的一个月指定一行)。通过从列出所有费用的表格中选择不同的年/月,我得到了可能的月数(但还有其他方法得到它-取决于是否有没有员工没有任何费用的月份,以及您是否希望将这些费用支付出去)
一旦这些被交叉连接以获得员工、月份和费用的每个组合,您就可以在子查询中加入实际费用,然后像以前一样进行组合并
未测试,但类似于以下内容:-
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
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
您是否可以显示所需的输出01/03/2014 99 san 4493.00 mar 500 2wheeler:4493 | pho exp:0.00 01/02/2014 99 san 0.00 mar 0.00 auto:4493 | food:0.00这是示例输出格式。帮我弄到这个。谢谢你的回复。。它很好用。在上述费用类型中,文本仅显示为id,我必须从主表中选择它。在该主表中,未使用的id将不得不以0的成本合并。表示:电话费=500,2轮=4493以上均已发出。我想要像电话费=500,2惠勒=4493,食物=0,住宿=0,。。像智者一样。。如何实现这一点?为此,您需要加入到列出可能的费用类型及其文本的表中。你能发布表格声明吗?创建表格如果不存在
tbl\u expense\u type
(exp\u type\u id
int(11)非空自动增量,exp\u cat\u id
int(11)非空,exp\u type\u text
varchar(50)非空,创建日期
datetime非空,created\u by
int(11)不为空,modified_date
datetime默认为空,modified_by
int(11)默认为空,is_delete
int(11)is_delete_byint(11)默认为空,is_delete_date
datetime默认为空,主键(exp type\u id
) ); 这是表格格式。。指导我此表的联接查询