Агрегатная функция умножения - PullRequest
2 голосов
/ 07 марта 2011

У меня есть таблица следующего вида:

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

Спасибо

Ответы [ 2 ]

9 голосов
/ 07 марта 2011

В идеале, 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 нечетно в этой строке
0 голосов
/ 01 апреля 2017

Вы можете определить следующие две функции:

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