【问题标题】:How to use group concat with group by?如何使用 group concat 和 group by?
【发布时间】:2014-05-29 19:29:08
【问题描述】:

我的表格已归档如下:

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

在这张桌子上,我想作为 单个用户行,每个月的费用类型和成本总和相结合,这意味着:三月有单行,费用类型和成本总和相结合。

【问题讨论】:

  • 你能显示想要的输出吗
  • 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 这是示例输出格式。帮助我如何获得它。

标签: mysql


【解决方案1】:

我建议做一个子查询来总结每个员工每月每笔费用的所有费用。然后将其用作获取员工列表、月份和 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

【讨论】:

  • 感谢您的回复.. 它工作正常。在提到的费用类型文本中仅显示为 id,我必须从主表中选择它。在那个主表中,未使用的 id 必须与成本 0 相连接。意味着:上面的电话费用 = 500,2 Wheeler = 4493 被拿出来。我想像 Phone Expense=500,2 Wheeler=4493, food=0,stay=0,.. 一样明智.. 如何实现?
  • 为此,您需要加入列出可能费用类型及其文本的表格。您可以为此发布表格声明吗?
  • 如果不存在则创建表 tbl_expense_type ( exp_type_id int(11) NOT NULL AUTO_INCREMENT, exp_cat_id int(11) NOT NULL, exp_type_text varchar(50) NOT NULL, @987654327 @ datetime NOT NULL, created_by int(11) NOT NULL, modified_date datetime DEFAULT NULL, modified_by int(11) DEFAULT NULL, is_delete int(11) NOT NULL DEFAULT '0', is_delete_by int (11)默认空值,is_delete_date日期时间默认空值,主键(exp_type_id));这是表格格式.. 指导我这个表格的连接查询
猜你喜欢
  • 2016-03-06
  • 2012-10-02
  • 2019-02-11
  • 2020-06-04
  • 2021-06-03
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多