UTNianos

Versión completa: Problema complejo de SQL
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
hola gente, necesito la colaboración de todos los cráneos de la UTN para resolver un problema con unos datos en sql server.
tengo la siguiente tabla:



| categoria | proveedor | nombre | fecha inicio | fecha fin | precio |
| A | 1 | papa | 01/01/01 | 05/01/01 | 2 |
| A | 2 | papa | 01/01/01 | 05/01/01 | 3 |
| A | 3 | papa | 01/01/01 | 05/01/01 | 2,5 |
| B | 1 | papa | 01/01/01 | 05/01/01 | 1 |
etc




es una lista de precios de productos. cada producto puede ser provisto por distintos proveedores, y tener varias categorías según la calidad.
los precios duran X días, entonces se va manteniendo un historial de precios.
así podemos saber, por ejemplo, que las papas categoría A del proveedor 1 valían $2 desde el 01/01/01 hasta el 05/01/01.
obviamente para un mismo proveedor, producto, categoría, y período, no puede haber haber dos precios diferentes.

¿cuál es el problema? que en algún momento se introdujo un error en la carga, y quedaron inconsistencias del tipo que mencioné anteriormente.
por ejemplo, sería incorrecto tener 2 registros así:


| categoria | proveedor | nombre | fecha inicio | fecha fin | precio |
| A | 2 | papa | 01/01/01 | 05/01/01 | 3 |
| A | 2 | papa | 03/01/01 | 08/01/01 | 2,5 |



porque en ese caso (mismo producto, mismo proveedor, misma categoría) tenemos 3 días que se superponen, con diferente precio. entonces si quiero saber el precio al día 04/01/01 tengo un problema. ¿se ve?

bueno, necesito un script sql que me permita detectar estas inconsistencias. o sea, tendría que buscar y acomodar los datos, de forma que pueda comparar los períodos que se superponen. la salida debería ser los registros que son inconsistentes.

logré hacerlo en smalltalk (casi una papa diría), pero el problema que tenemos es que debemos ejecutarlo sobre una base con miles de productos, donde las columnas a comparar no son categoría, proveedor y nombre, sino que son 5 más, y tiene que evaluar todo un año para detectar inconsistencias viejas.

si puedo lograr que el motor de base de datos resuelva el problema, seguro lo hace mucho más rápido.

bueno, les dejo la inquietud. gracias de antemano, salu2.
Algo asi?
Create Table #TablaPrueba (Categoria Varchar(50), Proveedor Varchar(50), FechaIni int, FechaFin int)
Insert Into #TablaPrueba Values ('A','Pepe',1,14)
Insert Into #TablaPrueba Values ('A','Pepe',15,29)
Insert Into #TablaPrueba Values ('A','Pepe',19,29)
Insert Into #TablaPrueba Values ('A','Pepe',33,53)

Select b.categoria,b.proveedor,b.fechaini,b.fechafin From #TablaPrueba a , #TablaPrueba b Where b.fechaini > a.fechaini and b.fechaini < a.fechafin --and filtrar por tipo, eso ya va en tu tabla particular

Salida:
A Pepe 19 29
Sí, algo así es lo que hago yo justamente.
El problema son los filtros =D
Create Table #TablaPrueba (Categoria Varchar(50), Proveedor Varchar(50), FechaIni int, FechaFin int)
Insert Into #TablaPrueba Values ('A','Pepe',1,14)
Insert Into #TablaPrueba Values ('A','Pepe',15,29)
Insert Into #TablaPrueba Values ('A','Pepe',19,29)
Insert Into #TablaPrueba Values ('A','Pepe',33,53)
Insert Into #TablaPrueba Values ('B','Cacho',55,70)
Insert Into #TablaPrueba Values ('B','Cacho',75,90)
Insert Into #TablaPrueba Values ('B','Cacho',95,210)
Insert Into #TablaPrueba Values ('C','GonzaSeLaCome',55,70)

Select b.categoria,b.proveedor,b.fechaini,b.fechafin
From #TablaPrueba a , #TablaPrueba b
Where b.fechaini > a.fechaini and
b.fechaini < a.fechafin and
b.Categoria=a.Categoria and
a.Proveedor=b.Proveedor

--Drop Table #TablaPrueba

y si no posteate un cacho de la tabla para verla bien.
(19-01-2011 09:38)SOY DE LA UBA! escribió: [ -> ]y si no posteate un cacho de la tabla para verla bien.

la tabla es la que puse arriba.

pero ya está, gracias!! tu ayuda me sirvió de mucho, ya casi que tengo el problema resuelto.

tengo que detectar varios casos:

1- registros iguales (sin importar el precio), o sea mismo inicio y mismo fin.
2- mismo inicio y distinto fin.
3- distinto inicio y mismo fin.
4- distinto inicio y distinto fin, pero solapados.

así que lo dividí en 4 scripts separados para analizar mejor los casos.
como dije, la tabla es un poco más compleja. tiene 17 campos de los cuales 5 o 6 son los que debo evaluar para detectar la igualdad.

tu solución fue MUY útil, y al final era bastante sencilla. por ahí por tener un problema complejo estaba buscando soluciones complejas, y no me avivé.

gracias!

Off-topic:
(19-01-2011 09:38)SOY DE LA UBA! escribió: [ -> ]Insert Into #TablaPrueba Values ('C','GonzaSeLaCome',55,70)

Atrevido ehhh whip
la proxima que te des vuelta te mando un Delete Rep_OutboxRequestData sin que te des cuenta y digo que fuiste vos ajajajjaja lol
URLs de referencia