我有四个表 department、team、expense 和 earning。
出发表:
id depart
团队表:
id name depart_id
费用表:
id team_id expense_type amount date
和收入表:
id team_id earning_type earning_peace date
我想计算离开虎钳总费用金额和总收入和平。我使用这个查询:
SELECT d.id, d.depart,
SUM(if(`earning_type` = 1, earning_peace, 0)) as earning_peace1,
SUM(if(`earning_type` = 2, earning_peace, 0)) as earning_peace2,
SUM(if(`earning_type` = 3, earning_peace, 0)) as earning_peace3,
SUM(if(`earning_type` = 4, earning_peace, 0)) as earning_peace4,
SUM(if(`expense_type` = 1, amount, 0)) as `expense1`,
SUM(if (`expense_type` = 2, amount, 0)) as expense2,
SUM(if (`expense_type` = 3, amount, 0)) as expense3,
SUM(if (`expense_type` = 4, amount, 0)) as expense4
FROM depart d INNER JOIN team m ON d.id = m.depart_id
LEFT JOIN earning e ON m.id = e.team_id
LEFT JOIN expense ex ON ex.team_id = m.id
GROUP BY d.id
但查询返回总收入的双倍金额。此查询中的错误是什么帮助?
最佳答案
这是一个技巧,它对于庞大的数据集来说可能会很慢,但是适当的索引可以让它发挥作用,分别为收入和支出制作数据集,然后加入两个数据集
SELECT * FROM
(SELECT d.id AS did, d.depart,
SUM( CASE WHEN `expense_type` = 1 THEN amount ELSE 0 END ) AS `expense1`,
SUM( CASE WHEN `expense_type` = 2 THEN amount ELSE 0 END ) AS `expense2`,
SUM( CASE WHEN `expense_type` = 3 THEN amount ELSE 0 END ) AS `expense3`,
SUM( CASE WHEN `expense_type` = 4 THEN amount ELSE 0 END ) AS `expense4`
FROM depart d
LEFT JOIN team m ON d.id = m.depart_id
LEFT JOIN earning e ON m.id = e.team_id
GROUP BY d.id
) expensetable
INNER JOIN
(
SELECT d.id AS did, d.depart,
SUM( CASE WHEN `earning_type` = 1 THEN earning_peace ELSE 0 END ) AS earning_peace1,
SUM( CASE WHEN `earning_type` = 2 THEN earning_peace ELSE 0 END ) AS earning_peace2,
SUM( CASE WHEN `earning_type` = 3 THEN earning_peace ELSE 0 END ) AS earning_peace3,
SUM( CASE WHEN `earning_type` = 4 THEN earning_peace ELSE 0 END ) AS earning_peace4
FROM depart d
LEFT JOIN team m ON d.id = m.depart_id
LEFT JOIN expense ex ON ex.team_id = m.id
GROUP BY d.id
) earningtable ON (expensetable.did = earningtable.did)
关于mysql - MYsql sum 如果返回双重计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19386211/