0

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 orderproduct_qty次のstockとおりです。

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呼び出された他のモジュールのフィールドを使用します。Cantidadproduct_qty

私は自分自身を説明したことを願っています。

4

1 に答える 1

4

sum列参照だけでなく、式を操作することに気付いていないかもしれません。

SELECT sum(a - b) FROM the_table;

の出力sumをさらに計算するために使用することもできます。

SELECT a - sum(b) FROM the_table;

基本的な代数変換は、b - aが と同等であることを示してい(-a) + bます。

これがあなたが探しているものではない場合、コメントに基づいて、あなたが望むものを言い換える必要があるかもしれないと思います.これはあなたが問題を抱えていると推測できる唯一のものだからです.

于 2013-06-03T02:01:29.827 に答える