Delphi - consulta muyy compleja

 
Vista:

consulta muyy compleja

Publicado por Mark Comix (8 intervenciones) el 05/03/2005 02:45:27
Hola: resulta que tengo una tabla de historiales donde para cada fecha hay un registro por usuario, ejemplo

enero 2004 jose deudor
enero 2004 martin deudor
enero 2004 juna nodeudor
enero 2004 pedro deudor
febrero 2004 jose deudor
febrero 2004 martin nodeudor
febrero 2004 juna nodeudor
febrero 2004 pedro deudor
---
----
----

el tema es que neceisto listar los cambios de estado en el ultimo periodo (ejemplo, variacion del estado entre febrero y enero para todas las personas)

jose enero deudor febrero deudor
martin enero deudor febrero no deudor
etc

y luego solo mostrar los que cambiaron, en el ejemplo mostrariaa martin, pero no a jose pues se mantiene en deudor

A alguien se le ocurre como hacer esta query??, probe de todo y nose como hacerlo. Tengan en cuenta que son muchassss personas y meses y solo debo mostar los cambios en el Ulitmo periodo
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 muyy compleja

Publicado por Kwerty (112 intervenciones) el 05/03/2005 06:41:53
Inicialmente, el número de registros de la tabla no importa, siempre que la instrucción esté bien hecha (da lo mismo que sea para 10 que para 1000, lo más que va a pasar es que tarde más tiempo en mostrar el resultado). A prori, la consulta no parece excesivamente dificil, pero creo que el problema es de diseño. Deberíamos saber cuales son los campos. Por ejemplo, si la tabla tiene
Fecha | Usuario | Estado
Enero Juan Deudor
...
o lo que sea (no me ha quedado muy claro esto después de leer el post). También hay que tener en cuenta a la hora de hacer una base de datos la normalización (aquí, si es así, se repite mucha información y no podemos saber facilmente si Juan cambió de estado debido a que no conocemos si hay un identificador único para esa persona).
Una vez resuelto esto, la consulta debería chequear el estado de Juan para este mes y el anterior, por ejemplo. Si el resultado es diferente (imagina que si debe es true y si no false), entonces está el trabajo hecho.
Perdona esta parrafada. Espero haberte ayudado. Si necesitas más ayuda, debes ser un poco más específico. Un saludo.
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 muyy compleja

Publicado por Mark Comix (8 intervenciones) el 05/03/2005 19:43:58
me parece que por intentar explicarlo sencillo, me quedo medio incompleta la explicación.
La tabla historial en realidad es asi:

ID_historial|Cuit (unico, tipo el documento)|Denominacion|estadoIVA|estadoMonotributo|fecha

ej
1|200000002|Garcia Juan|activo|inscripto|12/01/2005
2|200034005|Garcia Pedro|activo|inscripto|12/01/2005
9|200000002|Garcia Juan|pasivo|inscripto|22/02/2005
6|200034005|Garcia Pedro|activo|inscripto|22/02/2005
10|200034005|Garcia Pedro|activo|inscripto|22/03/2005

Los problemas estan en que tengo N personas (denominacion); no tengo un historico por cada mes y cada persona (puede ser que Juan tenga historial para enero, diciembre y febrero, mientras que otras personas tiene tambien marzo), por esto en el caso de Juan le reporte tiene que ser diferencias entre enero-febrero y en otra persona puede ser febrero-marzo; debo mostrar solo aquellos que tuvieron un cambio en algun campo, en el ultimo periodo

Ej reporte
200000002|Garcia Juan|activo|inscripto|12/01/2005|pasivo|inscripto|22/02/2005
200034005|Garcia Pedro|activo|inscripto|22/02/2005|activo|inscripto|22/03/2005

Luego debo elegir solo el que tuvo cambios

ej
200000002|Garcia Juan|activo|inscripto|12/01/2005|pasivo|inscripto|22/02/2005
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 muyy compleja

Publicado por Kwerty (112 intervenciones) el 05/03/2005 20:43:05
Ahora me parece un poco más claro... ; )
Si la BD tiene una tabla con Denominaciones (para poder recorrerla entera) y luego otra con los estados, la cosa no se complica tanto. De otro modo, si que es una cosa más complicada. Es decir, si los campos de Denominaciones se van a repetir en la tabla de estados, deberían estar representados una vez en Denominaciones, y su identificación en Estados (la que has escrito arriba).
Si estamos en el primer caso (el ideal), sería una cosa así:
1- Seleccionamos todos los campos de la tabla Denominaciones y los recorremos uno a uno. Luego los pasamos, uno a uno (mediante Delhi, en un for que recorra esta primera consulta, p. ej) al siguiente paso.
2- Por cada campo, hacemos una sentencia SQL en la que vemos si han habido cambios últimamente. Para eso, podemos hacer un
Select *
from Tabla_Denominaciones
where Denominacion=:Refrencia_Tabla_Denominaciones
order by Fecha
rows 2
Esto nos da las dos últimas entradas de la tabla para cada cliente. Así podremos ver si han cambiado.
Si no es así, dilo por aquí. Entonces crearé una tabla similar a la tuya y a ver que puedo hacer. Pero si depende de ti y no te va a fastidiar el trabajo te recomiendo un diseño normalizado. Sinceramente, evita este tipo de dolores de cabeza.
Un saludo.
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 muyy compleja

Publicado por Mark Comix (8 intervenciones) el 07/03/2005 00:10:37
si, ya habia pensado y probado la consulta que vos me pones, pero tiene un pequeño problema, esa consulta te devuelve la informacion de a un registro, uno por denominacion que paso por parametro, y yo necesito mostrar en una grilla TODAS las denominaciones que cambiaron, se entiende?. Talves hay una forma de ir juntando cada uno de los reportes, pero nose como se hace, lo hay?. o talves podria, nose si se puede, hacer algo asi como:
Select *
from Tabla_Denominaciones
where Denominacion= ESTA EN ESTE SUBCONJUNTO(DENOMINACIONES)
order by Fecha

nose si existe algo asi.
gracias por ayudarme y espero una nueva respuesta
rows 2
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 muyy compleja

Publicado por Kwerty (112 intervenciones) el 07/03/2005 19:59:27
Eso que dices se puede hacer mediante un procedimiento almacenado. Dependiendo de que base de datos estés usando se puede hacer o no.
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 muyy compleja

Publicado por Mark Comix (8 intervenciones) el 07/03/2005 23:46:32
Estoy usando SQL 2000, se puede???, como?, gracias una ves mas
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 muyy compleja

Publicado por Kwerty (112 intervenciones) el 08/03/2005 00:11:13
Supongo que SQL Server 2000 podrá hacerlo, pero no puedo decirte cómo. No he usado antes SQL Server y no sé muy bien donde se llega a eso. En Interbase es fácil, se escribe de manera similar a una instrucción SQL y se guarda como un procedimiento almacenado (que luego puedes lamar desde Delphi, por ejemplo). Consulta la ayuda de la base de datos acerca de Procedimientos Almacenados y a ver si alguno de los foristas te puede echar una ayuda sobre el tema.
Mucha suerte.
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