我有两个表,一个是成本表,另一个是付款表,成本表包含产品的成本和产品名称。
Cost Table
id | cost | name
1 | 100 | A
2 | 200 | B
3 | 200 | A
Payment Table
pid | amount | costID
1 | 10 | 1
2 | 20 | 1
3 | 30 | 2
4 | 50 | 1
现在我要把总成本加起来 name
值,以及按costid对付款总额求和,如下面的查询
totalTable
name | sum(cost) | sum(amount) |
A | 300 | 80 |
B | 200 | 30 |
不过,我一直在用下面的查询来解决这个问题,但我认为我做得非常错误。
SELECT
b.name,
b.sum(cost),
a.sum(amount)
FROM
`Payment Table` a
LEFT JOIN
`Cost Table` b
ON
b.id=a.costID
GROUP by b.name,a.costID
如果有人能帮我解答问题,或者更好的办法,我将不胜感激。谢谢您
3条答案
按热度按时间icnyk63a1#
这应该起作用:
sqlfiddle公司
3xiyfsfu2#
您需要在单独的查询中进行计算,然后将它们连接在一起。
第一个是直截了当的。
第二个你需要得到
name
与基于cost_id
sql fiddle演示输出
5jdjgkvh3#
有几个问题。首先,列引用应该是限定的,而不是聚合函数。
这是无效的:
应该是:
此查询应返回要查找的前两列:
当您将联接引入另一个表时,例如
Product Table
,在哪里costid
不是唯一的,你有可能产生(部分)笛卡尔积。若要查看它的外观,若要查看发生了什么,请移除
GROUP BY
以及骨料SUM()
函数,并查看使用join操作的查询返回的详细信息行。这将得到回报:
请注意,我们从中得到了id=1行的三个副本
Cost Table
.所以,如果我们修改了查询,添加
GROUP BY c.name
,并将c.cost Package 在sum()聚合中,我们将得到total的膨胀值cost
.为了避免这种情况,我们可以将
amount
从Payment Table
,所以我们每行只能得到一行costid
. 然后,当我们执行连接操作时,我们将不会从中生成行的重复副本Cost
.下面是一个查询,用于聚合
Payment Table
,所以我们为每个costid
.这将返回:
我们可以像使用表一样使用该查询的结果,方法是将该查询设置为“内联视图”。在本例中,我们为
v
查询结果(在mysql术语中,“内联视图”称为“派生表”。)