PDA

Ver la Versión Completa : Porcentajes con SQL ¿?


cartmanrules
18-05-2004, 19:51:18
Hola!

Estoy haciendo un programilla y uso Delphi 7 con Interbase 6.5. Me ha surgido la siguiente duda:

Quiero obtener el porcentaje que supone la suma de unas cantidades respecto al total, y querría saber si es posible con SQL. Abajo os paso 2 sentencias:

1) PARA OBTENER EL TOTAL DE KGS PARA EL SOCIO NUM 4

select sum(lin_kgsnetos) as total from lineas_entrada
where lin_socio=4

2) PARA OBTENER EL TOTAL DE KGS PARA UNA VARIEDAD PARA EL SOCIO 4

select sum(lin_kgsnetos) as total_gordo from lineas_entrada
where lin_socio=4
and lin_variedad='GORDO'

¿Cómo podría obtener el porcentaje que supone el valor obtenido en el punto 2 respecto al total obtenido en el punto 1 usando la misma sentencia?

Bye! :p

sanxpue
18-05-2004, 20:41:16
Eso lo puedes hacer en un SP


Procedure Procentaje (Socio Integer)
Returns (Porcentaje Float)
As
Declare Variable
Total Float,
Total_Gordo Float
Begin
select sum(lin_kgsnetos) from lineas_entrada into : Total;
select sum(lin_kgsnetos) from lineas_entrada
where lin_socio=4 And lin_variedad='GORDO' into : Total_Gordo;
Porcentaje = (Total_Gordo * 100 %) / Total;
Suspend;
End;


Weno por ahi es la idea je :D

jachguate
19-05-2004, 01:10:35
En una sola sentencia:


Select sum(l.lin_kgsnetos) Total_gordo,
(Select sum(lin_kgsnetos) from lineas_entrada l2 where l2.lin_socio = l.lin_socio) total_general,
(100 * sum(l.lin_kgsnetos) /
(Select sum(lin_kgsnetos) from lineas_entrada l2 where l2.lin_socio = l.lin_socio))
Porcentaje_gordos
from lineas_entrada l
where lin_socio = 4
and lin_variedad = 'GORDO';


No funciona en todos los motores, pero estoy casi seguro que en IB 6.5 si. Si no, podes crear una vista con la sentencia sin el cálculo de porcentaje, y hacer un select sobre esta dividiendo los dos términos.

Hasta luego.

;)

cartmanrules
19-05-2004, 13:21:49
Solucionado! Muchas gracias por vuestra ayuda :)

ContraVeneno
21-04-2008, 18:05:16
Hola, revivo este hilo porque tengo una duda similar:

Supongamos que mi subconsulta es muy muy muy compleja.

¿habría otra forma de hacerlo?, es decir, sí podría realizarlo como recomiendan en este hilo. Pero lo que no quiero hacer es tener que ejecutar ese subconsulta dos veces (una para mostrar el valor y otra para calcular el porcentaje).

¿Alguna idea para evitar ejecutar la subconsulta dos veces ?

Delphius
21-04-2008, 19:00:21
Hola, revivo este hilo porque tengo una duda similar:

Supongamos que mi subconsulta es muy muy muy compleja.

¿habría otra forma de hacerlo?, es decir, sí podría realizarlo como recomiendan en este hilo. Pero lo que no quiero hacer es tener que ejecutar ese subconsulta dos veces (una para mostrar el valor y otra para calcular el porcentaje).

¿Alguna idea para evitar ejecutar la subconsulta dos veces ?
Hola Contra, ¿tu te refieres a evitar hacer ese encadenamiento, que en ocasiones es un tanto molesto, para evitar lanzar varias subconsultas que al final es todo lo "mismo"?
Si es eso... lamentablemente si uno desea hacerlo a través de sólo consultas SQL no se puede hacerlo de una simple pasada.
Estos tipos de requisitos (como en este caso el porcentajes sobre el total) exigen dos pasadas.... Es a mi modo de ver... algo dificil (por no decir imposible) de un solo tirón.

Una alternativa es llevar un registro de dicha información ya procesada. Es decir que puede que sea más conveniente llevar alguna tabla "auxiliar" en donde lleves cálculos parciales de aquellas operaciones complejas. De este modo puede que con simples consultas (a lo mejor un poco más complicada pero seguramente más sencillas que estar realizando anidamientos) a dicha tabla.

Se que no te he dado la solución, pero al menos es una alternativa.

Saludos,

jachguate
21-04-2008, 21:27:01
Bueno, compañeros... eso depende de las capacidades del motor. Si es oracle, firebird 2.0 o SQL Server, podrías hacer esto, que suelen llamar inline views o tablas derivadas:


select q1.total_gordo, q1.total_general, 100 * q1.total_gordo / q1.total_general
from (
Select sum(l.lin_kgsnetos) Total_gordo,
(Select sum(lin_kgsnetos) from lineas_entrada l2 where l2.lin_socio = l.lin_socio) total_general,
from lineas_entrada l
where lin_socio = 4
and lin_variedad = 'GORDO'
) q1;


Hasta luego.

;)

Delphius
21-04-2008, 21:40:42
Bueno, compañeros... eso depende de las capacidades del motor. Si es oracle, firebird 2.0 o SQL Server, podrías hacer esto, que suelen llamar inline views o tablas derivadas:

Código SQL [-] (http://www.clubdelphi.com/foros/#)select q1.total_gordo, q1.total_general, 100 * q1.total_gordo / q1.total_general
from (
Select sum(l.lin_kgsnetos) Total_gordo,
(Select sum(lin_kgsnetos) from lineas_entrada l2 where l2.lin_socio = l.lin_socio) total_general,
from lineas_entrada l
where lin_socio = 4
and lin_variedad = 'GORDO' ) q1;


Hasta luego.

;)

Hola Juan:eek:
Te hacía en el evento... ¿una pequeña escapadita?:D

No he probado hacer una consulta como la que expones... No te voy a desafiar tus conocimientos porque se que sabes mucho del tema.

Yo estoy interpretando a lo que comenta Contra como que quiere evitarse estar haciendo esas series de subconsultas.

Yo andaba pensando en la idea de que si es posible tener una tabla con algunos datos que provengan de algunos cálculos de este modo se podría llegar a alivianar la consulta SQL haciendo la consulta sobre esta tabla y no sobre la "original".
No se si se entiende la idea.
O yo estoy confundido.:o:confused:

Saludos,

ContraVeneno
21-04-2008, 22:58:57
De echo maese Jachguate, además del promedio, estoy haciendo un "in line view" como mencionas. Que el SQL Server funcionan de maravilla y en muchas ocasiones me han sacado de muchos apuros.

He buscando en algunos lados y siempre he terminado con las mismas tres opciones: Un procedimiento almacenado, que funcionaría muy bien, pero mi consulta no es tan tan compleja como para un procedimiento. Una tabla derivada que funciona bien, pero igual tengo que ejecutar dos veces la subconsulta. Y la tercera, que es la misma subconsulta dos veces.

Al final voy a aprovechar las ventajas de la tabla derivada. Y sirve que tengo la opción de mostrar dos niveles de datos: Agrupados (con la tabla derivada) y sin agrupar (sin la tabla derivada :D).

Gracias por su tiempo de cualquier manera.