mysql - 如何组合三个表中的列并根据月份将它们显示在一行中?

标签 mysql sql join group-by

我有三张 table

enter image description here

enter image description here

enter image description here

我想从monthly_salaries中取出每月的total_salary总和,从扣除额中取出每月的总金额,从奖金中取出每月的总金额,并将它们显示在我的 View 中。我只是不知道该怎么做。

我分别尝试了它们,如下所示:

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);

我如何将它们合并起来,以便我可以连续获得当月的工资、奖金和扣除额?

最佳答案

您可以从查询中进行选择并加入它们。对于这三个结果,如果其中一个表中缺少一个月,您可能需要完整的外连接。不幸的是,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;

关于mysql - 如何组合三个表中的列并根据月份将它们显示在一行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59721191/

相关文章:

mysql - 如何优化mysql查询

mysql - 按文字排序 SQL 查询

Sql Server 2005错误处理-内部异常

sql - 100+ table 加入

python - 我可以用 Python 为 MySQL 编写 UDF 吗?

mysql - mysql 中外键约束格式错误

sql - 多列中出现的Postgresql计数

sql - 如何跨子域共享 session 状态

php - 更新加入 case mysql

php - 外键为空时如何从连接中拉出行