【问题标题】:Aggregate multiplicate function聚合乘法函数
【发布时间】:2011-07-10 06:08:40
【问题描述】:

我有以下表格:

1    X    10
2    X    30
3    Y    5
4    Y    2
...etc

我需要把它变成:

X    300   //(10 * 30)
Y    10    //(5 * 2)

所以我实际上正在寻找一种我可以使用的乘法函数,例如 sum、avg 和其他东西……这存在吗?

例如:

select field2, **multiply**(field3)
from t
group by field2

谢谢

【问题讨论】:

    标签: ms-access vba ms-office


    【解决方案1】:

    您可以定义以下两个函数:

    Public Function ResetProd() As Boolean
        Call Prod(Null)
        ResetProd = True
    End Function
    
    Public Function Prod(nNumber As Variant) As Double
        Static nPrevNumber As Double
        If IsNull(nNumber) Then
            nPrevNumber = 1
        Else
            nPrevNumber = nPrevNumber * nNumber
        End If
        Prod = nPrevNumber
    End Function
    

    ...并按如下方式使用它们:

    SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_
    WHERE RESETPROD()
    

    【讨论】:

    • 理论上这看起来不错,但你真的尝试过吗?它对我来说真的不起作用(有些行不止一次相乘),主要是:它不会聚合。而且你不能使用 GROUP BY。
    【解决方案2】:

    理想情况下,Access SQL 应该有一个可用的 PRODUCT 聚合函数,但它没有。然而,我们可以通过记住我们在学校(或不是......)学到的对数知识来模拟它,并记住对数总和的反对数等于乘积:

    SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3
    FROM t
    GROUP BY Field2
    

    请注意,如果有任何零值,则真正的 PRODUCT 函数只会为组返回 0,但如果有任何零值,此解决方案将失败,因此请注意那。此外,如果有任何负值,这种方法将不起作用。

    为了处理零,我们可以这样做:

    SELECT
        field2, 
        EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3,
        MIN(ABS(Field3)) AS MinOfAbsField3
    FROM t
    GROUP BY Field2
    

    然后忽略MinOfAbsField3 为零的任何行的ProductOfField3 值(因为这表示包含零的组,因此“真实”乘积应该是0

    为了处理负值,我们可以进一步这样做:

    SELECT
        field2, 
        EXP(Sum(LOG(IIf(Field3 = 0, 1, ABS(Field3))))) AS ProductOfField3,
        MIN(ABS(Field3)) AS MinOfAbsField3,
        SUM(IIf(Field3 < 0, 1, 0)) AS SumOfNegativeIndicator
    FROM t
    GROUP BY Field2
    

    并使用以下规则解释结果:

    • 如果 MinOfAbsField3 为零,则忽略该行的 ProductOfField3 - 乘积为零
    • 否则,给定行的必填答案为ProductOfField3,如果SumOfNegativeIndicator 在该行中为奇数,则否定

    【讨论】:

    • 感谢 AakashM。我以这种方式尝试过,但它不起作用,它一直说“无效的过程调用”,我无法确定错误的确切来源。我确定它不是来自我的其余查询,似乎访问不喜欢 EXP(Sum(LOG([X]))) 或其他什么。我最终使用了交叉表,因为我最多只有 3 列要相乘,但我会记下这一点以备将来需要。
    • @CoolStraw 如果任何值为零(或负数),您将得到错误。我将更新以指出一种处理这种情况的方法
    • +1。另一个尴尬的情况是,如果您不是分组而是计算整个表或空结果集的乘积。产品应该是 1。
    • 我想知道为什么EXP(Sum(LOG(Nz(Field3,0)))) 不会处理 Null 问题?
    • Nz(Field3, 1) 可以解决问题。零的自然对数不存在。
    猜你喜欢
    • 2015-10-29
    • 2021-03-10
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2011-07-21
    相关资源
    最近更新 更多