Aggregate multiplicate function

后端 未结 2 1778
野性不改
野性不改 2020-12-21 16:51

I have a table of the following:

1    X    10
2    X    30
3    Y    5
4    Y    2
...etc

I need to turn it into:

X    300          


        
相关标签:
2条回答
  • 2020-12-21 17:23

    You can define following two functions:

    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
    

    ...and use them as follows:

    SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_
    WHERE RESETPROD()
    
    0 讨论(0)
  • 2020-12-21 17:35

    Ideally, Access SQL would have a PRODUCT aggregate function available, but it doesn't. We can however simulate it by remembering what we learned about logarithms at school (or not...), and remembering that the anti-log of the sum of logs is equal to the product:

    SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3
    FROM t
    GROUP BY Field2
    

    Note that whereas a true PRODUCT function would simply return 0 for a group if there are any zero values, this solution will fail if there are any zero values, so watch out for that. Also, this approach won't work if there are any negative values.

    To deal with zeroes we could do this:

    SELECT
        field2, 
        EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3,
        MIN(ABS(Field3)) AS MinOfAbsField3
    FROM t
    GROUP BY Field2
    

    and then disregard the ProductOfField3 value for any row where MinOfAbsField3 is zero (as this indicates a group containing a zero, thus the 'true' product should be 0)

    To deal with negative values we could further do this:

    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
    

    and interpret the results with these rules:

    • If MinOfAbsField3 is zero, disregard ProductOfField3 for that row - the product is zero
    • Otherwise, the required answer for a given row is ProductOfField3, negated if SumOfNegativeIndicator is odd in that row
    0 讨论(0)
提交回复
热议问题