Mysql 如何合并三个表中的列并基于月份将它们显示在一行中?

Mysql 如何合并三个表中的列并基于月份将它们显示在一行中?,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,我有三张桌子 我想从月薪中提取月薪总额,从扣除额中提取月薪总额,从奖金中提取月薪总额,并将其显示在我的视图中。我就是不知道该怎么做 我分别进行了如下尝试: SELECT ANY_VALUE(DATE_FORMAT(date_added, '%m-%Y')), sum(m.total_salary) FROM monthly_salary m GROUP BY month(m.date_added), year(m.date_added); SELECT ANY_VALUE(DATE_FO

我有三张桌子

我想从月薪中提取月薪总额,从扣除额中提取月薪总额,从奖金中提取月薪总额,并将其显示在我的视图中。我就是不知道该怎么做

我分别进行了如下尝试:

SELECT ANY_VALUE(DATE_FORMAT(date_added, '%m-%Y')), sum(m.total_salary) FROM monthly_salary m GROUP BY month(m.date_added), year(m.date_added);

SELECT ANY_VALUE(DATE_FORMAT(date_added, '%m-%Y')), sum(d.amount) from deductions d GROUP BY month(d.date_added), year(d.date_added);

SELECT ANY_VALUE(DATE_FORMAT(date_added, '%m-%Y')), sum(b.amount) from bonuses b GROUP BY month(b.date_added), year(b.date_added);

如何将它们合并,以便我可以在一行中获得相同月份的工资、奖金和扣除额?

您可以通过普通月份加入它们:

SELECT ANY_VALUE(DATE_FORMAT(m.date_added, '%m-%Y')), 
       SUM(m.total_salary) AS total_salary,
       SUM(d.amount) AS deductions_amount,
       SUM(b.amount) AS bonuses_amount 
  FROM monthly_salary m
  JOIN deductions d ON month(d.date_added) = month(m.date_added)
  JOIN bonuses b ON month(b.date_added) = month(m.date_added)  
 GROUP BY month(m.date_added), year(m.date_added);

您可以从查询中选择并加入它们。对于这三个结果,如果其中一个表缺少一个月,则需要完整的外部联接。不幸的是,MySQL不支持完整的外部联接。如果保证一个表中永远不会有一个月,而另一个表中则不会有一个月,则您可以只进行内部联接:

SELECT
  CONCAT(LPAD(mnth, 2, 0), '-', yr),
  s.total AS salary,
  d.total AS deduction,
  b.total AS bonus
FROM
(
  SELECT
    month(date_added) AS mnth,
    year(date_added) AS yr,
    sum(total_salary) AS total
  FROM monthly_salary
  GROUP BY month(date_added), year(date_added);
) s
JOIN
(
  SELECT
    month(date_added) AS mnth,
    year(date_added) AS yr,
    sum(amount) AS total
  FROM deductions
  GROUP BY month(date_added), year(date_added);
) d USING (mnth, yr)
JOIN
(
  SELECT
    month(date_added) AS mnth,
    year(date_added) AS yr,
    sum(amount) AS total
  FROM bonuses
  GROUP BY month(date_added), year(date_added);
) b USING (mnth, yr)
ORDER BY yr, mnth;
如果可能缺少月份,请先选择“所有月份”,然后在子查询上方选择“左外部联接”:

SELECT
  CONCAT(LPAD(mnth, 2, 0), '-', yr),
  s.total AS salary,
  d.total AS deduction,
  b.total AS bonus
FROM
(
  SELECT month(date_added) AS mnth, year(date_added) AS yr
  FROM monthly_salary
  UNION
  SELECT month(date_added) AS mnth, year(date_added) AS yr
  FROM deductions
  UNION
  SELECT month(date_added) AS mnth, year(date_added) AS yr
  FROM bonuses
) months
LEFT JOIN (...) s USING (mnth, yr)
LEFT JOIN (...) d USING (mnth, yr)
LEFT JOIN (...) b USING (mnth, yr)
ORDER BY yr, mnth;

你们也有员工表吗?你有没有没有没有月薪、奖金或扣除额的员工?是的,我有没有月薪、奖金和扣除额记录的员工。那又怎样;在公布的数据中,老板的表格是什么?你只想要那些已经发了工资的人的结果吗?不,我想要所有的结果,不仅仅是paidI感谢你的手势,但这并不正确。谢谢你,伙计,你的解决方案让我找到了我的解决方案。