ms access - tabla - Función multiplicar agregada
microsoft access desde cero (2)
Tengo una tabla de lo siguiente:
1 X 10
2 X 30
3 Y 5
4 Y 2
...etc
Necesito convertirlo en:
X 300 //(10 * 30)
Y 10 //(5 * 2)
así que de hecho estoy buscando una especie de función de multiplicación que pueda usar como suma, media y otras cosas ... ¿existen chicos?
por ejemplo:
select field2, **multiply**(field3)
from t
group by field2
Gracias
Idealmente, Access SQL tendría una función agregada de PRODUCT
disponible, pero no es así. Sin embargo, podemos simularlo recordando lo que aprendimos sobre los logaritmos en la escuela (o no ...), y recordando que el anti-registro de la suma de los registros es igual al producto:
SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3
FROM t
GROUP BY Field2
Tenga en cuenta que mientras que una verdadera función de PRODUCT
simplemente devolvería 0
para un grupo si hay valores cero, esta solución fallará si hay valores cero, así que tenga cuidado con eso. Además, este enfoque no funcionará si hay valores negativos.
Para tratar con ceros podríamos hacer esto:
SELECT
field2,
EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3,
MIN(ABS(Field3)) AS MinOfAbsField3
FROM t
GROUP BY Field2
y luego ignorar el valor de ProductOfField3
para cualquier fila donde MinOfAbsField3
sea cero (ya que esto indica un grupo que contiene un cero, por lo tanto, el producto ''verdadero'' debe ser 0
)
Para lidiar con los valores negativos, podemos hacer más esto:
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
e interpretar los resultados con estas reglas:
- Si
MinOfAbsField3
es cero, noProductOfField3
cuentaProductOfField3
para esa fila - el producto es cero - De lo contrario, la respuesta requerida para una fila dada es
ProductOfField3
, negada siSumOfNegativeIndicator
es impar en esa fila
Puede definir las siguientes dos funciones:
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
... y úsalas de la siguiente manera:
SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_
WHERE RESETPROD()