2013-06-02 75 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