我在 PostgreSQL 中搜索了与 AGGREGATION 函数 sum()
等效的函数,但没有找到。
我需要从另一个字段的数据中减去一个字段的数据。
代码如下:
'''SELECT
p.purchase_id,sum(m.Cantidad), m.state
FROM
stock_move m
LEFT JOIN
stock_picking p on (p.id=m.picking_id)
WHERE
p.purchase_id IN %s GROUP BY m.state, p.purchase_id'''
在这种情况下,purchase_id
求和到 Cantidad
它是数据,并存储在 stock_picking
中,但是我实际上需要减去而不是求和,有据我所知,PostgreSQL 中没有减法函数,那么我应该使用哪个函数来完成这个任务?
编辑:
我在 OpenErp 中有 2 个模块,它们管理产品(销售、库存、采购等),当我批准采购订单时,我需要从名为 的字段中减去采购的产品数量Cantidad
在另一个模块中,所以,我知道如何在 OpenErp 中关联它们,问题是我不知道如何从这个 Cantidad
中减去数量。
据我所知,将从 purchase order
接收的产品加到 stock
中的 product_qty
的函数如下如下:
def desc_cert(self, cr, uid, ids, context=None):
if not ids: return {}
res = {}
for id in ids:
res[id] = [0.0,0.0]
cr.execute('''SELECT
p.purchase_id,sum(m.product_qty), m.state
FROM
stock_move m
LEFT JOIN
stock_picking p on (p.id=m.picking_id)
WHERE
p.purchase_id IN %s GROUP BY m.state, p.purchase_id''',(tuple(ids),))
for oid,nbr,state in cr.fetchall():
if state=='cancel':
continue
if state=='done':
res[oid][0] += nbr or 0.0
res[oid][1] += nbr or 0.0
else:
res[oid][1] += nbr or 0.0
for r in res:
if not res[r][1]:
res[r] = 0.0
else:
res[r] = 100.0 * res[r][0] / res[r][1]
return res
所以,我认为我需要一个更小、更简单的函数来从我的 Cantidad
字段中得到这个减法。在我的例子中,我不需要任何库存或拣货参数,只需从 purchase_id
中减去其中包含的产品(通过像本例那样对它们进行分组)并使用另一个名为Cantidad
而不是 product_qty
。
我希望我已经解释清楚了。
最佳答案
我想您可能没有意识到 sum
对表达式进行运算,而不仅仅是列引用:
SELECT sum(a - b) FROM the_table;
您还可以使用 sum
的输出进行进一步的计算:
SELECT a - sum(b) FROM the_table;
基本代数变换表明 b - a
等价于 (-a) + b
。
如果这不是您要查找的内容,那么根据评论,我认为您可能需要改写您想要的内容,因为这是我唯一能猜到您可能遇到问题的内容。
关于python - 从字段中减去数据 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16885951/