Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: lucius en Marzo 03, 2015, 04:35:35 pm
-
Quiero obtener el ultimo registro ingresado en mi tabla correspodiente a determinado id_prod
El campo id_stock es autonumerico
(http://thumbs.subefotos.com/86bf8ac3ccbd1a65f2e161c2a7b961a1o.jpg) (http://subefotos.com/ver/?86bf8ac3ccbd1a65f2e161c2a7b961a1o.png)
SELECT MAX(id_stock) AS ID, precio_compra
FROM stock
WHERE id_prod='0011'
GROUP BY precio_compra;
La consulta anterior me arroja 3 resultados dado que el precio compra es diferente en ciertos casos.
000435 8.50
000685 3.00
001170 7.00
lo que necesito obtener el 7.00 osea el que corresponde al ultimo id ingresado.
-
Hola.
¿No te conviene agrupar por id_prod?
SELECT MAX(id_stock) AS ID, precio_compra
FROM stock
WHERE id_prod='0011'
GROUP BY id_prod;Saludos.
Jerónimo
-
Hola Jeronimo que problema se presentaria agrupar por id?
Utilizar la clausula TOP es una solucion(No tengo idea si sea lo correcto) pero siempre y cuando se quiera buscar el ultimo precio de un determinado articulo.
SELECT TOP 1 id_prod,precio_compra
FROM stock
WHERE id_prod='0054'
ORDER BY id_stock DESC;
Que pasa si quiero saber el ultimo precio de todos los producto, que tendria que hacer?, apelo a sus criterios si es correcto hacer esto o buscar otras opciones.
-
Según planteás, id_stock es autonumérico, con lo cual, al agruparse por ese campo, no habría nada para agrupar (corríjanme los que realmente saben de bases de datos si estoy equivocado, por favor). Lo que quiero decir es que el agrupamiento toma a todos los registros que tengan el mismo valor en el campo por el que se quiere agrupar. Si ese campo es autonumérico, no habrá al menos dos registros con el mismo valor.
En cambio, al agrupar por id_prod se van a tomar todos los registros con el mismo valor en ese campo y se van a agrupar. Luego, de cada grupo se tomará el mayor valor de id_stock y el valor de precio_compra.
No sé si me explico bien. Ojalá venga alguno de los gurús de bases de datos a traer algo de luz.
Saludos.
Jerónimo
-
Hola Lucius. Tu preguntas:
Quiero obtener el ultimo registro ingresado en mi tabla correspodiente a determinado id_prod
¿Que es "ultimo"? ¿te refieres "a lo registrado" o a cronología?. Si es a cronología tienes que conjugar también con el campo fecha, si es al ultimo grabado tienes que buscar el id mas alto correspondiente. Lo que pasa es que muchas veces no nos sirve el ultimo registrado porque funcionalmente a veces los usuarios no registran en orden. Alguien registra con fecha 10/03 y chapa el id 666 y después de eso registra con fecha 05/03 en el id 669... ¿cual es el ultimo?, ojo con eso.
Aplicas Group By por uno de los campos del Select, en este caso mi amigo Jeronimo agrupo por id_prod cuando ese campo no esta en el Select, es un pequeño lapsus que se resuelve agregando ese campo en el select, pero luego no es necesario agrupar si ya excluiste a todos, es decir en el where forzamos a buscar a un id_prod especifico y por ello el Group By en este escenario no es recomendable, a cambio de ello es mejor usar Top 1.
En ese caso tu ultimo query en el que usas Top 1 con un ORDER BY DESC es el correcto, aunque en lo personal yo no confiaría en el resultado por lo que expuse arriba.
Ahora tu preguntas:
Que pasa si quiero saber el ultimo precio de todos los producto, que tendría que hacer?,....
En ese caso, si te sirve el código de Jeronimo (el del Group By) con el detalle de que debemos quitar el WHERE id_prod='0011', es decir, no debes hacer distinción del Id_Prod ya que el código agrupara por Id_Prod y nos dara el Max de Id_Stock.
Aclaro, estos códigos se ejecutaran sin errores como tal, pero funcionalmente hay una buena posibilidad de que la realidad lo invalide, SALVO QUE hallas hecho todas las validaciones previas en el momento de registro, sin contar que al parecer consultas a una tabla transaccional que siempre crecerá y por tanto la consulta con el tiempo se irá haciendo ineficiente. Yo te recomendaría que tengas en alguna tabla un campo con el "UltimoPrecio" y cada vez que haces una inserción la actualizas a ella, luego la consulta contra esa tabla sera super veloz.
Sino la chunte, igual seguiré también esperando al guru :) :) :)
Saludos
-
jajaja ¡No sé en qué estaba pensando!
Cierto, amigo Yván. No tiene ningún sentido lo que sugerí.
Concretamente, la consulta de Lucius es:
Quiero obtener el ultimo registro ingresado en mi tabla correspondiente a determinado id_prod
Allí tenés toda la razón en que solamente hay que filtrar por id_prod y obtener el id_stock más alto (con top, con max, o como fuere en cada gestor). ¡No tiene sentido agrupar!
Perdón, Lucius, se me escapó.
¿Que es "ultimo"? ¿te refieres "a lo registrado" o a cronología?. Si es a cronología tienes que conjugar también con el campo fecha, si es al ultimo grabado tienes que buscar el id mas alto correspondiente. Lo que pasa es que muchas veces no nos sirve el ultimo registrado porque funcionalmente a veces los usuarios no registran en orden. Alguien registra con fecha 10/03 y chapa el id 666 y después de eso registra con fecha 05/03 en el id 669... ¿cual es el ultimo?, ojo con eso.
Excelente observación.
Sabía que llegaría el gurú ;)
Saludos.
Jerónimo
-
Solo una pequeñita observación estimado:
...que solamente hay que filtrar por id_prod y obtener el id_stock más alto (con top, con max, o como fuere en cada gestor).
Top y Max están en todos los gestores (aunque explicitamente no se si debemos decir gestor o motor), bueno en Firebird en vez de llamarse Top se llama First pero hace exactamente lo mismo, la diferencia es que Top es una clausula y Max es una función, Top no usa Group By y la aplica a toda la sabana del select, Max puede usar Group By cuando queremos aplicar resultados por grupo indicado. Alli la dejo pa' no caer espeso
;D ;D ;D
-
Muchas gracias por la aclaración.
Qué bueno es aprender algo todos los días.
Jerónimo
-
Solo queda decir gracias por el soporte, saludos
-
Hola yacosta, jeronimo tengo todas sus sugerencias en cuenta.
Bueno no he podido obtener el ultimo precio compra de todos los productos si lo hago como dijo jeronimo solo obtengo idprod pero si agrego el precio_compra tengo el problema que mencione al comienzo osea me arroja tres resultados(dependiendo si hay preciocompras distintos) de un mismo producto, a estas alturas ya se me bloqueo el brain.
Dejo mi bd y asi se animan a darme soporte, http://www.mediafire.com/download/aa2g6ge02u4de43/080808.accdb (http://www.mediafire.com/download/aa2g6ge02u4de43/080808.accdb)
saludos
-
Bueno hoy tengo prohibido programar los domingos, aprovecho en escribir ya que mi esposa salio a comprar unos panes asi que mañana lunes lo veo. :-) salvo que el amigo Jeronimo se adelante.
P.D: Nada importante, pero seria bueno que no uses la palabra "soporte", esto no es "soporte" porque el soporte implica una obligación de resolver problemas previamente contratado por un cliente y tu no eres cliente, esto es ayuda, "colaboración entre amigos" si quieres. Lo digo en tono amiguero, soporte me hace sentir que trabajo :-), no es importante pero es bueno llamar a lo que es por su nombre.
Abrazos
-
Coincido en ambos puntos referidos por Yván. Pero en cuanto al primero, a veces, si por algo no puedo conciliar el sueño, aprovecho la calma de la noche para relajarme y entrar en este café ;)
Lucius: probá de la siguiente manera.
SELECT TOP 1 *
FROM stock
WHERE id_prod='0011' ORDER BY id_stock DESC
Puse "*", aunque en general no es recomendable, para que verifiques todos los campos que trae y veas si es lo que necesitás. Luego, en caso afirmativo, reemplazalo por los campos que quieras recuperar. Por ejemplo:
SELECT TOP 1 id_stock AS id, precio_compra
FROM stock
WHERE id_prod='0011' ORDER BY id_stock DESCEspero que esta vez sirva mi intervención :-\
Jerónimo
-
Hola, utilizando nose si sea clausula o sentencia top obtengo lo que necesito sin embargo necesito obtener los ultimoa precios de todos los productos. La bd esta diseñada asi aunque estos datos que busco deberian estar en otra tabla como menciono yacosta lo cual tengo en cuenta sin embargo necesito esa info ahora, espwro encontrar la solucion por que estoy por tirar la toalla.
-
Hola a todos, bueno gracias a Jeronimo, Yacosta y la ayuda de otro gran maestro se soluciono mi problema, muchas gracias por el tiempo brindado, saludos
SELECT t1.id_stock, t1.id_prod, t1.fechacompra,t1.precio_compra
FROM
STOCK AS t1
LEFT JOIN
(SELECT MAX(id_stock) AS stk, id_prod FROM stock GROUP BY id_prod) AS t2
ON (t1.id_stock=t2.stk) AND (t1.id_prod=t2.id_prod)
WHERE t2.stk IS NOT NULL
-
Flor de consulta! :D
-
Hola, con hacer solo
SELECT @@IDENTITY
funciona para access 2000 en adelante, pero lamentablemente no funciona para DAO y DAO que se basa en cursores internamente.
si tenes un campo ID en la tabla que se va incrementando, simplemente con hacer:
SELECT TOP 1 campo1 * FROM STOCK ORDER BY ID DESC