添加所有行乘以另一个表中的另一行

时间:2009-12-07 07:45:40

标签: php mysql postgresql

我希望我能解释得这么好。我有3张桌子。 wo_parts,workorders和part2vendor。我试图在一个月内获得所有零件的成本价格。我有这个脚本。

$scoreCostQuery = "SELECT SUM(part2vendor.cost*wo_parts.qty) as total_score 
                       FROM part2vendor 
                       INNER JOIN wo_parts 
                         ON (wo_parts.pn=part2vendor.pn)  
                       WHERE workorder=$workorder";

我想要做的是每个部分都在wo_parts中(在partnumber [pn]下面)。该项目的成本在part2vendor(部件号[pn]下)。我需要将part2vendor中的每个零件价格乘以wo_parts中的销售数量。所有3个绑定的方式是workorders.ident = wo_parts.workorder和part2vendor.pn = wo_parts.pn。我希望有人可以提供帮助。上面的脚本没有给我与计算器添加时相同的总数。

2 个答案:

答案 0 :(得分:1)

这不是答案,只是评论。

为什么不在SQL语句之外进行求和/乘法运算?我知道,这似乎很愚蠢,因为它会增加代码行和脚本的复杂性,但是,尽管如此,保持代码和SQL语句尽可能远是一件好事。

答案 1 :(得分:1)

我可以看到类似这样的关键原因是类型问题。例如,如果您使用的是FLOAT而不是NUMERIC,则可能会发生这种情况,您可能会得到稍微不同的答案。这是一个太常见的错误,顺便说一下。

我建议您仔细检查您的架构,以确保您在这里全面使用NUMERIC。 NUMERIC在PostgreSQL上非常强大,它表现非常出色,并且它可以正确支持任意精度操作。如果您无法更改数据类型,请在查询中将字段转换为数字。

FLOAT类型(包括DOUBLE)是固定精度二进制数,它们并不总是与基数10完全对应。 NUMERIC在内部存储为基数1000(表示每30位9位),这对于转换为二进制或从二进制转换非常有效。精度也是任意的,尽管它具有最大值。但是,对于财务资料,数值数据类型的最大值或精度不是问题。你应该自由地使用它们。