理想情况下,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 在该行中为奇数,则否定