В идеале, Access SQL должен иметь агрегированную функцию PRODUCT
, но это не так.Тем не менее, мы можем смоделировать его, вспомнив, что мы узнали о логарифмах в школе (или нет ...), и помня, что анти-лог сумма сумм логов равна:
SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3
FROM t
GROUP BY Field2
Примечаниечто в то время как истинная функция PRODUCT
просто возвращает 0
для группы, если есть какие-либо нулевые значения, это решение будет fail , если есть какие-либо нулевые значения, так что следите за этим.Кроме того, этот подход не будет работать, если есть какие-либо отрицательные значения.
Чтобы справиться с нулями, мы могли бы сделать это:
SELECT
field2,
EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3,
MIN(ABS(Field3)) AS MinOfAbsField3
FROM t
GROUP BY Field2
, а затем игнорировать значение ProductOfField3
для любой строки, где MinOfAbsField3
равно нулю (поскольку это указывает на группу, содержащую нольтаким образом, «истинный» продукт должен быть 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
нечетно в этой строке