2013-06-02 74 views
0

我在PostgreSQL中搜索了一个等效的AGGREGATION函数sum(),但是没有找到任何。从字段中减去数据 - PostgreSQL

我需要从另一个数据中减去一个字段的数据。

的代码去如下:

'''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里没有减功能远据我所知,我应该用哪个函数来完成这项任务?

编辑:

我有2个模块,在OpenERP的,其管理的产品,(销售,库存,采购等),当我批准采购订单,我需要减去,购买的产品数量从另一个模块中称为Cantidad的字段,所以,我知道如何将它们与OpenErp相关联,问题是我不知道如何从这个Cantidad减去数量。

据我所知,该款项,从purchase orderstock收到的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)的字段。

我希望我已经解释了我自己。

+2

当然有一个函数来减去值。请添加您的Postgres版本,并澄清您想要从中减去什么。 –

+0

谢谢你,Postgres版本是9.2,我想从“Cantidad”中减去“purhase_id” – NeoVe

+0

你在哪个RDBMS代码中给出了预期的输出?你能否提供关于模式的细节? – vyegorov

回答

3

我想你可能没有意识到,sum一个表达式工作,不只是一个列引用:

SELECT sum(a - b) FROM the_table; 

您还可以使用的sum输出用于进一步的计算:

SELECT a - sum(b) FROM the_table; 

基本的代数转换表明b - a相当于(-a) + b

如果这不是你要找的,那么基于评论,我认为你可能不得不改变你想要的,因为这是我猜测你可能遇到的唯一问题。

+0

是的,这是关键,对不起,我不能更好地解释自己,非常感谢你! – NeoVe