聚合乘法函数

时间:2011-03-07 10:15:43

标签: ms-access vba ms-office

我有一张以下表格:

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

我需要把它变成:

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

所以我实际上正在寻找一种乘法函数,我可以像sum,avg和stuff那样使用......这个存在吗?

例如:

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

谢谢

2 个答案:

答案 0 :(得分:9)

理想情况下,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

然后忽略ProductOfField3为零的任何行的MinOfAbsField3值(因为这表示包含零的组,因此'true'产品应为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否定

答案 1 :(得分:0)

您可以定义以下两个功能:

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()