我有三张 table
我想从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/