Nuevamente con lo del top 5

21/05/2004 - 21:47 por Cesar Ochica | Informe spam
Bueno inicialmente me esta ayudando el gran Ulises pero al parecer se ha
desconectado por un rato.

E inicio este nuevo hilo por que yo no he podido dar solucion al problema y
es muy urgente para mi.


OK, tengo una sola tabla en la que esta la informacion de los Movimientos de
los Productos.

TipoDoc Char(1) ' Indica si es Factura 'F' o Compra 'P'
NumDoc Decimal 'Numero del Documento
AnoDoc Int16 'Año de el documento
MesDoc Int16 'Mes del documento
DiaDoc Int16 'Dia del documento
Tercero string ' Es el nombre del tercero a quie se le vendio o se le compro
MovCta Decimal 'Cuenta movida por el documento
PID Decimal 'es la llave del producto movido
PDes String 'Es la descripcion del doc Movido
CantidadMov Int16 'Cantidad de articulos Movidos
ValorMov Decimal 'Valor de articulos movidos


Y tengo el programa externo que consulta las facturas y cuando se ve
una factura quiero que envie el numero de la factura y el store con el
numero de la factura averigue que articulos movio esa factura y retorne los
cinco ultimos movimientos de cada articulo.

Por ejemplo estoy viendo la factura 4049 y esta tiene tres articulos
entonces el store recibe el numero de factura y ubica los PID de los
articulos movidos (3 para el ejemplo) y retorna los cinco ultimos
movimientos de cada uno (o sea 15 registros).

Gracias

Preguntas similare

Leer las respuestas

#1 Javier Loria
23/05/2004 - 05:09 | Informe spam
Hola Cesar:
Prueba con :
SELECT ProductosOrdenados.NumDoc
, ProductosOrdenados.Pid
FROM ( SELECT PID
FROM Movimientos
WHERE
) AS ProductosenOrden
JOIN ( SELECT M1.NumDoc
, M1.Pid
, COUNT(*) AS Orden
FROM Movimientos AS M1
JOIN Movimientos AS M2
ON M1.NumDoc<=M2.NumDoc
AND M1.Pid=M2.PID
GROUP BY M1.NumDoc, M1.Pid
) AS ProductosOrdenados
ON ProductosenOrden.Pid=ProductosOrdenados.Pid
WHERE ProductosOrdenados.Pid<=5
Espero te sirva porque va sin probar y puede tener problemas de sintaxis
y definitivamente debe ser lento.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Cesar Ochica escribio:
Bueno inicialmente me esta ayudando el gran Ulises pero al parecer se
ha desconectado por un rato.

E inicio este nuevo hilo por que yo no he podido dar solucion al
problema y es muy urgente para mi.


OK, tengo una sola tabla en la que esta la informacion de los
Movimientos de los Productos.

TipoDoc Char(1) ' Indica si es Factura 'F' o Compra 'P'
NumDoc Decimal 'Numero del Documento
AnoDoc Int16 'Año de el documento
MesDoc Int16 'Mes del documento
DiaDoc Int16 'Dia del documento
Tercero string ' Es el nombre del tercero a quie se le vendio o se le
compro MovCta Decimal 'Cuenta movida por el documento
PID Decimal 'es la llave del producto movido
PDes String 'Es la descripcion del doc Movido
CantidadMov Int16 'Cantidad de articulos Movidos
ValorMov Decimal 'Valor de articulos movidos


Y tengo el programa externo que consulta las facturas y cuando se ve
una factura quiero que envie el numero de la factura y el store con el
numero de la factura averigue que articulos movio esa factura y
retorne los cinco ultimos movimientos de cada articulo.

Por ejemplo estoy viendo la factura 4049 y esta tiene tres articulos
entonces el store recibe el numero de factura y ubica los PID de los
articulos movidos (3 para el ejemplo) y retorna los cinco ultimos
movimientos de cada uno (o sea 15 registros).

Gracias
Respuesta Responder a este mensaje
#2 ulises
24/05/2004 - 06:45 | Informe spam
Hola César,

Con la siguiente sentencia obtienes los primeros 5 de cada pid

select *
from movimientos m
where cast(pid as char(20)) + cast(numdoc as char(4)) in
( select top 5 cast(pid as char(20)) + cast(numdoc as char(4))
from movimientos
where pid = m.pid
order by pid, numdoc )
)

también es factible ordenarlas mediante un JOIN con la misma tabla,
pero eso asume una clave única, que dada la data que me alcanzaste no
logro identificar (es más, sospecho que no lo tiene, lo cual sería un
grave problema de diseño).

luego de ello podrías hacer otra subconsulta para obtener solo los pid
pertenecientes al numdoc deseado :

select * from
(
select *
from movimientos m
where cast(pid as char(20)) + cast(numdoc as char(4)) in
( select top 5 cast(pid as char(20)) + cast(numdoc as char(4))
from movimientos
where pid = m.pid
order by pid, numdoc )
) solocinco
where pid in ( select pid from movimientos where numdoc = 4049 )

revisa otras opciones, agrega un índice sobre pid y sonre numdoc y
prueba el rendimiento de la consulta.

Saludos,
Ulises


On Fri, 21 May 2004 14:47:48 -0500, "Cesar Ochica"
wrote:

Bueno inicialmente me esta ayudando el gran Ulises pero al parecer se ha
desconectado por un rato.

E inicio este nuevo hilo por que yo no he podido dar solucion al problema y
es muy urgente para mi.


OK, tengo una sola tabla en la que esta la informacion de los Movimientos de
los Productos.

TipoDoc Char(1) ' Indica si es Factura 'F' o Compra 'P'
NumDoc Decimal 'Numero del Documento
AnoDoc Int16 'Año de el documento
MesDoc Int16 'Mes del documento
DiaDoc Int16 'Dia del documento
Tercero string ' Es el nombre del tercero a quie se le vendio o se le compro
MovCta Decimal 'Cuenta movida por el documento
PID Decimal 'es la llave del producto movido
PDes String 'Es la descripcion del doc Movido
CantidadMov Int16 'Cantidad de articulos Movidos
ValorMov Decimal 'Valor de articulos movidos


Y tengo el programa externo que consulta las facturas y cuando se ve
una factura quiero que envie el numero de la factura y el store con el
numero de la factura averigue que articulos movio esa factura y retorne los
cinco ultimos movimientos de cada articulo.

Por ejemplo estoy viendo la factura 4049 y esta tiene tres articulos
entonces el store recibe el numero de factura y ubica los PID de los
articulos movidos (3 para el ejemplo) y retorna los cinco ultimos
movimientos de cada uno (o sea 15 registros).

Gracias


Respuesta Responder a este mensaje
#3 Cesar Ochica
25/05/2004 - 14:40 | Informe spam
Gracias Javier aprecio mucho tu ayuda.

Saludos,

Cesar
Respuesta Responder a este mensaje
#4 Cesar Ochica
25/05/2004 - 14:44 | Informe spam
Una solucion que nunca se me ubiese ocurrido, Gracias


Y en cuanto al diseño, si es un verdadero desastre pero lo manipulo asi por
motivos ajenos ya que es la informacion vinculada de un programa ajeno al
que desarrollo.

GraciasTotales
Respuesta Responder a este mensaje
#5 Javier Loria
25/05/2004 - 15:18 | Informe spam
Hola:
Una nota adicional, el codigo al final del Where debe ser:
WHERE ProductosOrdenados.Orden<=5
Saludos

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
"Cesar Ochica" wrote in message
news:
Gracias Javier aprecio mucho tu ayuda.

Saludos,

Cesar


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida