【问题标题】:Subtract data from field - PostgreSQL从字段中减去数据 - PostgreSQL
【发布时间】: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


【解决方案1】:

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

SELECT sum(a - b) FROM the_table;

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

SELECT a - sum(b) FROM the_table;

基本代数变换表明b - a 等价于(-a) + b。

如果这不是您要查找的内容,那么根据 cmets,我认为您可能需要重新表述您想要的内容,因为这是我猜您可能遇到的唯一问题。

【讨论】:

  • 是的,这就是重点,抱歉我无法更好地解释自己,非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2018-05-03
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多