PHP - consulta mysql

 
Vista:

consulta mysql

Publicado por julio (54 intervenciones) el 27/12/2010 00:24:28
Estimado/s:
Tengo la siquiente tabla TRANSACC, con los campos id-cliente; periodo; id-movimiento;pago;secuencia.

Esta tabla se llena con las transacciones de los clientes; cuando el cliente rectifica los datos de un mismo periodo, se rectifican todos los registros que genero originalmente, y se incrementa la secuencia en uno.

O sea que un cliente llega a tener duplicados, triplicados, ...todos los registros que genero para ese periodo, pero la secuencia siempre sera mayor y es la ultima que vale.

O sea un cliente :
1) Puede tener diferentes secuencias por un mismo periodo
2) Puede tenes la misma secuencia pero por distintos periodos

Por ejemplo la tabla real es similar a este ejemplo:

-----------------------------------------------------------------
id-cli |periodo |id-movimiento|pago|secuencia | fecha
-----------------------------------------------------------------
001 |201010 | 100 |100 | 003 | 15-11-2010
001 |201010 | 101 |120 | 003 | 15-11-2010
001 |201010 | 102 | 99 | 003 | 15-11-2010
001 |201010 | 103 | 75 | 003 | 15-11-2010
001 |201010 | 104 |205 | 003 | 15-11-2010

001 |201010 | 100 | 75 | 001 | 10-10-2010
001 |201010 | 101 | 77 | 001 | 10-10-2010
001 |201010 | 102 |207 | 001 | 10-10-2010
001 |201010 | 103 |359 | 001 | 10-10-2010
001 |201010 | 104 |125 | 001 | 10-10-2010

001 |201009 | 100 | 75 | 000 | 15-11-2010
001 |201009 | 101 | 77 | 000 | 15-11-2010
001 |201009 | 102 |207 | 000 | 15-11-2010
001 |201009 | 103 |359 | 000 | 15-11-2010
001 |201009 | 104 |125 | 000 | 15-11-2010

003 |201010 | 100 | 75 | 000 | 09-10-2010
003 |201010 | 101 | 77 | 000 | 09-10-2010
003 |201010 | 102 |207 | 000 | 09-10-2010
003 |201010 | 103 |359 | 000 | 09-10-2010
003 |201010 | 104 |125 | 000 | 09-10-2010

003 |201008 | 100 | 25 | 000 | 09-10-2010
003 |201008 | 101 | 70 | 000 | 09-10-2010
003 |201008 | 102 |178 | 000 | 09-10-2010
003 |201008 | 103 |300 | 000 |09-10-2010
003 |201008 | 104 |301 | 000 | 09-10-2010

La consulta que arme

Select max(secuencia), id-cli,periodo, id-movimiento, sum(pago) from transacc where fecha>=01-10-2010 and fecha <=31-10-2010 group by id-cliente, secuencia, periodo

(me tira los movimientos totalizados por las distintas secuencias y lo que necesito es solo el registro totalizado de la ulima secuencia)

Tambien intente con esta
Select max(secuencia), id-cli,periodo, id-movimiento, sum(pago) where fecha>=01-10-2010 and fecha <=31-10-2010 and secuencia=(select max(sencuencia) from transacc )group by id-cliente, secuencia, periodo

(Me devuelve un solo registro de la maxima secuencia de toda las transacciones )

Creo que si tiene solucion a traves de una consulta, probe diferentes posibilidaes, y hasta aqui no logre lo esperado.

¿Alguien puede ayudarme a arnar la consulta?

Desde ya muchisimas 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

RE:consulta mysql

Publicado por Leandro (37 intervenciones) el 27/12/2010 15:03:32
Si lo que quieres es la suma total de los pagos de la ultima secuencia de un cliente
puedes hacerlo asi:

select t.id-cli, sum(t.pago)
from transacc t
where t.secuencia = ( select max( t1.secuencia) where t1.id-cli = t.id-cli)
group by t.id-cli

Esta consulta por cada cliente te devuelve la suma de los pagos de la ultima
secuencia de ese cliente.

Espero te sirva
Saludos
Leandro
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

RE:consulta mysql

Publicado por julio (54 intervenciones) el 27/12/2010 19:08:53
Muchisimas gracias.
Efectivamente, necesito sumar todos los registros del cliente de su ulima secuencia. En todos los clientes, la primera secuencia es el cero, pero la secuenta aumenta por cada cliente cuando rectifica los datos del periodo. O sea que la secuencia para el cliente que no modifica, sigue igual.

El desafio es efectivamente, sumar los registros por cada cliente de su ultima secuencia.

Aqui transcribo como quedó la consulta; pero no funciona.

No devuelve ningun mensaje, tampoco remite error. Solo se duerme y no arroja ningun resultado.

select t.id-cli, sum(t.pago) from transacc
t where t.secuencia = ( select max(t1.secuencia) from transacc t1 where t1.id-cli = t.id-cli) group by t.id-cli

¿Dónde estaría el error?

Desde ya mchisimas gracias
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

RE:consulta mysql

Publicado por Leandro (37 intervenciones) el 28/12/2010 11:42:05
Lo que te hace la consulta es por cada cliente agrupa las tuplas que tengan
la secuencia maxima y luego suma todos los pagos de cada cliente
y te devuelve el id-cliente y la suma total.

La consulta me parece esta correcta.
El "Solo se duerme y no arroja ningun resultado" me suena a que aun la consulta no
ha terminado de procesar los datos, la velocidad de las consultas depende de
como este definida la tabla, de los indices que hayas definido para la tabla y tambien
en como se escribe la consulta.

Si la consulta tuviera errores el motor de base de datos lo reportaría , por lo que me suena a que no contiene errores la consulta.

Para saber cuantos datos tiene la tabla hace:

select count(*) from transacc;

Cual es la clave primaria de la tabla? definiste algun indice?

Saludos
Leandro
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

RE:consulta mysql

Publicado por julio (54 intervenciones) el 29/12/2010 00:52:15
Estimado

Muchisimas gracias por tu valioso aporte. No tenia definido ninguna clave primaria, hoy defini un indice y la consulta efectivamente me devuelve la informacion correcta.

Es un poco lenta, pero funciona. Para definirle una clave primaria, tendria que hacerla concatenada. ¿definiendo una clave primaria mejorará los tiempos de respuesta?

La única clave primaria tendria que ser id-cli+periodo+movimiento+secuencia.

Desde ya muchisimas gracias.
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

RE:consulta mysql

Publicado por Leandro (37 intervenciones) el 29/12/2010 13:36:04
La clave primaria se utiliza para definir de forma unica a cada tupla de una tabla.
No puede haber dos tuplas con igual clave primaria, por lo tanto en la clave primaria
debes incluir aquellos campos que para varias tuplas no se pueden repetir.

Por ej: si defines la clave primaria conteniendo id-cli y periodo
en la base de datos no habrá dos clientes con igual id-cli y periodo.

Saludos
Leandro
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