Ms access 聚合乘法函数

Ms access 聚合乘法函数,ms-access,vba,ms-office,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) 所以我实际上在寻找一种乘法函数,我可以用它,比如求和,平均值等等。。。这存在吗,伙计们 例如: select field2, **multiply**(field3) from t group by field2 感谢您,理想情况下,Access SQL会有

我有以下表格:

1    X    10
2    X    30
3    Y    5
4    Y    2
...etc
我需要把它变成:

X    300   //(10 * 30)
Y    10    //(5 * 2)
所以我实际上在寻找一种乘法函数,我可以用它,比如求和,平均值等等。。。这存在吗,伙计们

例如:

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

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

SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3
FROM t
GROUP BY Field2
请注意,如果存在任何零值,真正的
产品
函数只会为组返回
0
,但如果存在任何零值,此解决方案将失败,因此请注意这一点。此外,如果存在任何负值,这种方法将不起作用

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

SELECT
    field2, 
    EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3,
    MIN(ABS(Field3)) AS MinOfAbsField3
FROM t
GROUP BY Field2
然后忽略
MinOfAbsField3
为零的任何行的
productofield3
值(因为这表示包含零的组,因此“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
选择
字段2,
EXP(总和(日志(IIf(字段3=0,1,ABS(字段3‘‘‘)’))作为字段3的产品,
MIN(ABS(Field3))作为MinOfAbsField3,
和(IIf(字段3<0,1,0))作为负指示器的和
从t
按字段分组2
并用以下规则解释结果:

  • 如果
    MinOfAbsField3
    为零,则忽略该行的
    productofield3
    ——乘积为零
  • 否则,给定行的所需答案为
    productoffeld3
    如果
    SumOfNegativeIndicator
    在该行中为奇数,则为否定
您可以定义以下两个功能: …并按如下方式使用它们:

SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_
WHERE RESETPROD()

谢谢你,阿卡什。我试过这样做,但没有成功,它一直在说“无效的过程调用”,我无法准确地指出错误的来源。虽然我确信它不是来自我查询的其余部分,但access似乎不喜欢EXP(Sum(LOG([X]))或其他东西。我最终使用了一个交叉表,因为我最多只有3列要乘法,但我会注意这一点,以备将来需要。@Coolstrow如果其中任何一个值为零(或负值),您将得到这个错误。我将更新以指明一种处理这种情况的方法+1。另一个尴尬的情况是,如果您不是在分组,而是在计算整个表或空结果集的乘积。乘积应该是1。我想知道为什么
EXP(Sum(LOG(Nz(Field3,0)))
不会处理空值问题?Nz(Field3,1)会解决这个问题。零的自然对数是不存在的。这在理论上看起来不错,但你真的试过了吗?它对我来说并不起作用(有些行被多次相乘),而且主要是:它不会聚合。你不能使用分组方式。
SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_
WHERE RESETPROD()