【发布时间】:2013-06-02 18:31:13
【问题描述】:
我在 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.
我希望我已经解释过了。
【问题讨论】:
-
当然有减值的功能。请添加您的 Postgres 版本,并说明您想从什么中减去什么。
-
谢谢,Postgres版本是9.2,我想从“Cantidad”中减去“purhase_id”
-
由于您是按
p.purchase_id分组的,因此您的声明I want to subtract the "purhase_id" from "Cantidad"几乎没有任何意义。是否要从所有相关m.Cantidad的 sum 中减去p.purchase_id?但话又说回来,LEFT JOIN似乎走错了方向。您需要提供正确的问题和正确的信息。 -
老实说,没有。我仍然很难理解这一点。您正在混合“模块”和表格的术语,或者您已经拥有的和想要的。我暂时放弃。也许别人明白。表定义可能会有所帮助。
-
注意:where 子句
p.purchase_id IN %s实际上会将LEFT JOIN转换为普通连接,并且“stock_move”的非统计行将从结果集中被丢弃。正如 Edwin 评论的那样:这没有任何意义;很难掌握意图。
标签: python postgresql openerp