PDA

Ver la Versión Completa : Problemas con subtotales


Jucho69
26-03-2010, 14:26:01
Hola al Foro

Tengo la siguiente dificultad no logro establecer los subtotales de esta tabla en Access. :confused:

Cliente-------------Importe
Cubatur--------------$163
Cubatur--------------$512
Rosello---------------$290
Rosello---------------$419
Rosello---------------$177
Sime-----------------$432
Sime-----------------$178

Y necesito lograr

Cliente-------------Importe
Cubatur--------------$163
Cubatur--------------$512
---------------------$675
Rosello---------------$290
Rosello---------------$419
Rosello---------------$177
---------------------$886
Sime-----------------$432
Sime-----------------$178
---------------------$610

Algo así en una sola consulta, he tratado de hacerlo con la propia codificación SQL de la tabla o desde Delphi pero ni modo, solo me sale un subtotal, yo cojí esta tabla de pruebas para que sea facil su compresión.

Saludos

Caro
26-03-2010, 14:50:44
Hola jucho 69, a mi se me ocurre hacerlo con 2 consultas y despues unirlas:


Select Cliente, Importe From Tabla
Union
Select Cliente, sum(Importe) as Importe From Tabla Group By Cliente
Order By 1,2


Saluditos

Casimiro Notevi
26-03-2010, 15:05:23
Ojalá yo manejara el sql como tú, Caro :eek:

Jucho69
26-03-2010, 15:36:47
Hola Caro

!Que bien!, no se me hubiera ocurrido, gracias por tu ayuda, si alguno de ustedes me pudieras recomendar algún post o buen manual sobre SQL y consultas relacionales, sería de mucha ayuda.

Saludos ;)

Caro
26-03-2010, 16:00:07
Ojalá yo manejara el sql como tú, Caro :eek:

Hola amiguito, la verdad nose si mi nivel de sql sea bueno, hasta hace un año y medio no podía hacer cosultas complicadas, pero gracias a algunos hilos que respondio nuestro amigo poliburro (3 hilos, los que pude ver y estudiarlos). Ahora cada ves que sale una pregunta en sql, me pruebo para ver si mi cabecita puede resolver esa consulta :).

!Que bien!, no se me hubiera ocurrido, gracias por tu ayuda, si alguno de ustedes me pudieras recomendar algún post o buen manual sobre SQL y consultas relacionales, sería de mucha ayuda.


Solo comentarte que el Order By tiene que ser por tus dos campos para que salga en el orden que quieres. Sobre un buen manuel no podría recomendarte ninguno porque de los que vi, la mayoría explica solo lo basico.

Saluditos

movorack
26-03-2010, 16:12:44
también puedes añadir una columna de ordenamiento extra... solo para hacerlo más facil...


Select 0 as ord, Cliente, Importe From Tabla
Union
Select 1 as ord, Cliente, sum(Importe) as Importe From Tabla Group By Cliente
Order By Cliente, ord

Casimiro Notevi
26-03-2010, 16:32:50
Definitivamente, voy a comprarme otro libro de sql, este que tengo es muy básico :D

Jucho69
26-03-2010, 17:01:08
Hola movorack

Sí, la columna de ordenamiento es una opció más, gracias, es verdad lo que dice Carro que los manuales son muy básicos, buscaré por los demás Foros a ver que encuentro.


Hola Casimironotevi, si encuentro algo te lo envío a tu correo.

Un Saludo ;)

fjcg02
26-03-2010, 22:11:06
Hola a todos,
el tipo de consultas que propone Caro creo que no aparece en ningún manual. Sí aparece algo en la ayuda de Firebird , no recuerdo como lo llama ( tablas derivadas creo).
Ahora bien, estas consultas son TERRIBLEMENTE funcionales, y generalmente TERRIBLEMENTE inificientes en cuanto a velocidad de respuesta, ya que exprimen al motor de base de datos a tope ya que no son 'naturales'. Esto quiere decir que no se utilizan índices ni nada parecido ( generalmente ) y lo que hace el motor es generar una tabla temporal recorriendose las tablas que intervienen de cabo a rabo.
Para confirmarlo es conveniente mirar el plan de ejecución, y además es conveniente medir si es mejor ahorrarse un procedimiento almacenado que cuajar el servidor unos segundos. Sobre todo cuando nuestra base de datos tiene muchos registros.

Casimiro, tus aplicaciones de tropecientos gigas que sueles comentar funcionan estupendamente tanto tiempo y con esos volúmenes porque no conoces estas consultas enrevesadas.
Y que conste, que a mi me gustan :D, ya que como Caro, me reto a ver si se puede hacer en una sola consulta o no.

Un saludo

Casimiro Notevi
26-03-2010, 22:32:21
Tienes razón, en parte, porque si el servidor es linux y tienes más de una cpu, cuando lanzas la consulta ocupa una de las cpu, pero las demás siguen libres para seguir antendiendo a los restantes usuarios.

He hecho una prueba con una pequeñita, poco más 500 Mb. y efectivamente el primer select lo recorre entero "natural", aunque de todas formas, el tiempo requerido ha sido 1 segundo.


Prepare time: 00:00:00.
Field #01: .CLIENTE Alias:CLIENTE Type:INTEGER
Field #02: .TOTAL Alias:TOTAL Type: DOUBLE PRECISION
PLAN (TBCABECERASFACTURASVENTAS NATURAL)
PLAN (TBCABECERASFACTURASVENTAS ORDER INDCABFACVEN_CLIENTECODIGO)


Executing...
Done.
317488 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 62675 index, 62631 seq.
Delta memory: 1184 bytes.
Execute time: 00:00:01.
Script execution finished.


Con otra tabla que tiene más registros (1279329), 2 segundos:

Prepare time: 00:00:00.
Field #01: .CODIGOPEDIDO Alias:CODIGOPEDIDO Type:INTEGER
Field #02: .PRECIO Alias:PRECIO Type: DOUBLE PRECISION
PLAN (TBLINEASALBARANESVENTAS NATURAL)
PLAN (TBLINEASALBARANESVENTAS ORDER RDB$FOREIGN3)


Executing...
Done.
1279329 fetches, 0 marks, 10697 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 253736 index, 253720 seq.
Delta memory: 1192 bytes.
Execute time: 00:00:02.
Script execution finished.


La prueba la he hecho en mi ordenador personal, ubuntu 8.04 con firebird 2.1 y un AMD athlon 64 x2 dual 4600 con 2 Gb

rgstuamigo
26-03-2010, 23:13:08
Solo comentar que la consulta correcta debería ser con una Union All ya que en realidad segun el requerimiento de Jucho69 es que por cada cliente salga cada importe efectuado más (+) la suma de todos los importe, lo cual significa que la cantidad de registro(tuplas)devueltas en la consulta general deben ser :
Total registros=Cantidad de registro de la primera sub_consulta + Cantidad de registro de la segunda sub_consulta
Quedando la consulta SQL así:
(Select Cliente, Importe From Tabla) #<-Primera sub_consulta
Union All
(Select Cliente, sum(Importe) as Importe From Tabla Group By Cliente) #<-Segunda sub_consulta
Order By Cliente,Importe
Quizás los parentesis estan demás pero creo que es mejor ponerlo para una mejor comprensión de lo que se está haciendo.;).
Saludos...:)

Casimiro Notevi
27-03-2010, 00:11:19
De esa forma ha sido más rápido incluso, de 2 segundos a 1 seg.

Prepare time: 00:00:00.
Field #01: .CODIGOPEDIDO Alias:CODIGOPEDIDO Type:INTEGER
Field #02: .PRECIO Alias:PRECIO Type: DOUBLE PRECISION
PLAN (TBLINEASALBARANESVENTAS NATURAL)
PLAN (TBLINEASALBARANESVENTAS ORDER RDB$FOREIGN3)


Executing...
Done.
1279329 fetches, 0 marks, 10697 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 253736 index, 253720 seq.
Delta memory: 1192 bytes.
Execute time: 00:00:01.
Script execution finished.

Jucho69
29-03-2010, 19:15:21
Hola

Gracias a todos por la ayuda, muy atento rgstuamigo, ya creo que contigo habia visto algo parecido, con Union All se pueden enlazar varias consultas previas incluso desde la propia base de datos.

Saludos