Access - Hallar porcentaje secuencial en tabla

 
Vista:
Imágen de perfil de Mayra

Hallar porcentaje secuencial en tabla

Publicado por Mayra (9 intervenciones) el 09/09/2016 00:53:41
Buenas tardes, tengo una tabla de aproximadamente nueve millones de registros, con valores para cada registro, me han pedido que corte la tabla cuando el valor de esta sea el 30% del total acumulado en toda la tabla.

Existe alguna manera de hacerlo a través de una consulta que me diga por ejemplo al frente de cada valor a que porcentaje del total corresponde?

Algo así:



ejemplo

Agradezco a todos gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 8
Ha disminuido su posición en 29 puestos en Access (en relación al último mes)
Gráfica de Access

Hallar porcentaje secuencial en tabla

Publicado por Juan R. (18 intervenciones) el 09/09/2016 11:34:11
Buenas Mayra

Hay una manera de hacerlo con SQL, es decir, sería con consultas. Lo que tendrías que hacer es una cosa similar a ésta:

SELECT * FROM tutabla where tabla.valor > = (SELECT SUM(valor) FROM tu tabla) * 0,3

Lo he hecho de memoria, así que puede existir algo mal en la sintaxis de la consulta, pero sería algo similar a eso.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mayra

Hallar porcentaje secuencial en tabla

Publicado por Mayra (9 intervenciones) el 10/09/2016 00:12:38
Buenas tardes.

Gracias por tu colaboración, Juan R.

Mi tabla se llama "Servicios" y el campo donde están los valores se llama "Valor", es de tipo numérico, coloque tu consulta así:

SELECT * FROM Servicios where Servicios.Valor > = (SELECT SUM(Valor) FROM Servicios) * 0;3

Me genera un error "Error de sintáxis" (falta operador) en la expresión de consulta 'Servicios.Valor > = (SELECT SUM(Valor) FROM Servicios) * 0;3

Por favor me corrige si coloque algo mal.

Un saludo

Mayra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mayra

Hallar porcentaje secuencial en tabla

Publicado por Mayra (9 intervenciones) el 10/09/2016 00:31:27
Ha quedado en el SQL así:

SELECT Servicios.Valor, *
FROM Servicios
WHERE (((Servicios.Valor)>=(SELECT SUM(Valor) FROM Servicios)*0.3));

pero no me muestra donde esta el número de registro hasta donde llega el porcentaje (0.3), me muestra una grilla vacía.

En el ejemplo el 30% se cumple en el registro 2 que corresponde a JOSÉ GÓMEZ, que corresponde a la suma del 20% de JUAN PEREZ, más el 10% de JOSÉ GÓMEZ.


Saludos

Mayra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Hallar porcentaje secuencial en tabla

Publicado por Jesus (54 intervenciones) el 10/09/2016 14:06:56
Interesante pregunta .... :-)

Entiendo que lo vamos a realizar solo con consultas, sin usar VBA.

Lo primero que necesitamos es tener una función que nos realice una suma acumulada en una consulta, como Access no nos la proporciona nos la tenemos que crear nosotros. Esta basada en la función de 'Numerar una consulta', el principio de funcionamiento es el mismo.

Para ello, cópiate esta función en un modulo independiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'--------------------------------------------------------------------------------------------- 
' Autor : JESUS MANSILLA CASTELLS -Mihura-	
'---------------------------------------------------------------------------------------------
Public Function RT_SumarSQL(nDato) As Double
'variable que no se pierde entre las distintas llamadas
Static nSUMA As Double
 
    If IsNull(nDato) Then 'si nDato es nulo: variable a cero y salida
        nSUMA = 0
        Exit Function
    End If
 
    nSUMA = nSUMA + nDato
    RT_SumarSQL = nSUMA
 
End Function


Ahora ya nos podemos crear una consulta que nos cree la tabla que necesitamos. Para mis pruebas he llamado a tu tabla de datos: TMayra

Para crear la consulta en la ventana del generador de consultas pones:

1
2
3
4
5
6
SELECT * INTO TMayra1
FROM (SELECT id, Nombre, Valor, 0.00 AS Porcentaje, RT_SumarSQL(Null) AS CSuma
FROM TMayra WHERE 1=0
UNION ALL
SELECT id, Nombre, Valor, [Valor]/(SELECT Sum(Valor) FROM TMayra)*100 AS Porcentaje, RT_SumarSQL([Porcentaje]) AS CSuma
FROM TMayra)  AS T1

Esta consulta te crea una nueva tabla TMayra1, que contiene ademas de los datos iniciales, el porcentaje de la linea sobre el total y la suma arrastrada de porcentajes.

Para obtener lo que tu deseas, basta con que tires de esta segunda tabla escogiendo el porcentaje de corte deseado.

No se puede (o no he conseguido) poder filtrar el porcentaje en la consulta inicial, al ser una función no me deja filtrarlo (o no doy con la tecla).

La instrucción:
1
SELECT id, Nombre, Valor, 0.00 AS Porcentaje, RT_SumarSQL(Null) AS CSuma FROM TMayra WHERE 1=0

es para iniciar el campo suma a cero.



Si lo quisieras hacer con VBA el camino sería parecido, pero muchísimo más rápido, ya que le daríamos calculada la suma de valores, en vez de tener que hacerlo la máquina por cada registro (hablas de 7 millones de registros).

Ya me contarás.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mayra

Hallar porcentaje secuencial en tabla

Publicado por Mayra (9 intervenciones) el 10/09/2016 17:34:13
!Ho¡ Señor Jesús, como siempre, tu eres mi salvación.
Bendiciones mil, su ejemplo fenomenal, era justo como lo necesitaba, de nuevo muchas bendiciones por su gran corazón y espíritu de colaboración.

Una amiga a su servicio.

Se puede dar por terminada esta pregunta.

Un abrazote

Mayra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Hallar porcentaje secuencial en tabla

Publicado por Jesus (54 intervenciones) el 10/09/2016 17:42:06
Hey ... pensando, pensando .... la consulta puede ser muy lenta motivada por

1
SELECT Sum(Valor) FROM TMayra

Que se ejecuta en cada registro (a lo mejor Access es más listo que nosotros y solo ejecuta una vez), así que he dado un paso más y he sustituido esa suma por otra función, que nos calcule la suma solo una vez.

Dónde pusiste el RT_SumarSQL, añade esta otra:

1
2
3
4
5
6
7
8
9
10
11
12
13
'--------------------------------------------------------------------------------------------- 
' Autor : JESUS MANSILLA CASTELLS -Mihura-	
'---------------------------------------------------------------------------------------------
Public Function RT_SumaTotal(nDato) As Double
'variable que no se pierde entre las distintas llamadas
Static nSUMATot As Double
 
    If IsNull(nDato) Then 'si nDato es nulo: calculo la suma total
        nSUMATot = DSum("Valor", "TMayra")
    End If
    RT_SumaTotal = nSUMATot
 
End Function


Y la consulta que ejecutas, hay que modificarla así:

1
2
3
4
5
6
SELECT * INTO TMayra1
FROM (SELECT id, Nombre, Valor, RT_SumaTotal(Null) AS Porcentaje, RT_SumarSQL(Null) AS CSuma
FROM TMayra WHERE 1=0
UNION ALL
SELECT id, Nombre, Valor, [Valor]/RT_SumaTotal(1)*100 AS Porcentaje, RT_SumarSQL([Porcentaje]) AS CSuma
FROM TMayra)  AS T1

Debería ganar un montón de tiempo en la ejecución de la misma.

Un saludo.



PD. Valora las respuestas ... :-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar