mysql - MYsql sum 如果返回双重计数

标签 mysql

我有四个表 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/

相关文章:

MySQL 提供精确的预先指定的 ORDER BY 子句

php - 如何将时间戳值更新/插入到 PHP/MySQL 中的时间戳字段中?

mysql - 几个名字的列表,用相同的信息更新他们在表中的行

mysql - 如何使用两个 where 子句优化 SQL 查询?

mysql - 更新表格以根据文本列记录位置

javascript - 单击按钮删除 MySQL 中的任何行

php - 插入mysql/php困难

javascript - Sequelize GROUP BY & CROSS JOIN with Variables 的最佳实践

mysql - 在 bash 中存储来自 sql select 的多个值

python - 使用带有外部变量的python将数据插入mysql