mysql - 如何获得链接到第三个表的两个表的总和

标签 mysql sql sql-server tsql postgresql

是否有任何 sql 向导可以帮助解决这个问题: 假设我有 3 个表:

tbltype        tblvalue               tblcost
id  | type     id  | val | typeid     id  | cost| typeid
----------     ------------------     ------------------ 
1   | aaa      1   | 3   | 1          1   | 5   | 1 
2   | bbb      2   | 2   | 1          2   | 3   | 1
               3   | 2   | 2          3   | 1   | 2
               4   | 1   | 2          4   | 4   | 2

当我运行这个查询时:

SELECT t.type, SUM(val), SUM(cost)
FROM
    tbltype t 
    LEFT JOIN tblcost c ON (c.typeid = t.id)
    LEFT JOIN tblvalue v ON (v.typeid = t.id)
GROUP BY t.type;

我得到了错误的值

type | SUM(val) | SUM(cost)
---------------------------
aaa  | 10       | 16
bbb  | 6        | 10

我如何获得正确的值:

type | SUM(val) | SUM(cost)
---------------------------
aaa  | 5        | 8
bbb  | 3        | 5

为什么 sql 会有这样的行为?

最佳答案

要了解原因,请从查询中取出组和总和,然后查看它的总和:

SELECT t.type, val, cost
FROM
    tbltype t 
    LEFT JOIN tblcost c ON (c.typeid = t.id)
    LEFT JOIN tblvalue v ON (v.typeid = t.id)

您会看到输出中有来自 tblcost 和 tblvalue 的行的每种可能组合——这意味着当您对它们求和时,其中一些会被计算多次。

您需要分别聚合 tblcost 和 tblvalue。然后您可以将它们加入到 tbltype 中。加文的回答已经显示了一种方法。另一种方式是:

SELECT t.type, COALESCE(cost, 0) AS cost, COALESCE(val, 0) AS val
FROM tbltype t
     LEFT JOIN (SELECT SUM(cost) AS cost, typeid FROM tblcost GROUP BY typeid) tc
       ON tc.typeid = t.id
     LEFT JOIN (SELECT SUM(val) AS val, typeid FROM tblvalue GROUP BY typeid) tv
       ON tv.typeid = t.id

...根据您实际使用的数据库引擎,其性能可能会或可能不会不同(可能会更好,也可能不会更好)。

关于mysql - 如何获得链接到第三个表的两个表的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8064676/

相关文章:

sql-server - 根据非 NULL 且早于行日期的最接近日期将值插入 NULL 行

php - 在 MySQL 的同一个 WHERE 上使用来自 PHP 的两个变量

c# - 从C#调用Azure SQL存储过程非常慢

sql-server - SQL Pivot 查询从 VIEW 表中提取数据

sql-server - 多个语句以防 MDX

sql - 如何在分组查询中添加 'total' 行(在 Postgresql 中)?

mysql - 按允许或阻止的值过滤 50k+ 行

MySQL 进行自连接以将具有公共(public) ID 的记录组合起来

php - 尝试使用 laravel 删除值时出错

sql - 我是否应该创建一个新的数据库列?