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