none
Select Distinct con Select Top en Acces 2010 RRS feed

  • Pregunta

  • Hola a todos:

    Tengo dos tablas:

    Articulos (Num_articulo, Nom_articulo)

    Precios (Num_articulo, costo, rentabilidad, fecha_cambio)

    La tabla precio contiene el historial de precios de los articulos, de donde puede existir muchas fechas con diferentes valores pero no pueden existir dos fechas iguales para el mismo Articulo.

    Lo que quiero hacer es: Una consulta que me muestre los 10, 20 o 30 (segun se requiera) articulos con mayor rentabilidad "((Precios.Costo/100)*Precios.Rentabilidad)" pero si un articulo era mas rentable hace dos meses (01-04-2012) y tuvo un cambio de precio ayer (27-06-2012) que disminuyo su rentabilidad y aun así sigue siendo de los mas rentables me muestre la ultima rentabilidad osea que me muetre la rentabilidad del 27-06-2012.

    Actualmente tengo esta consulta:

    SELECT DISTINCT TOP 100 Articulos.Num_articulo, Articulos.C_barras, Articulos.Nom_articulo, Precios.Costo, Precios.Rentabilidad, Precios.Fecha_cambio, ((Precios.Costo/100)*Precios.Rentabilidad) AS Expr1 FROM Articulos INNER JOIN Precios ON Articulos.Num_articulo = Precios.Num_articulo ORDER BY ((Precios.Costo/100)*Precios.Rentabilidad) DESC;

    Y me muestra esto:

    Alguna idea de como realizar esto?

    Saludos y muchas gracias!


    Luis Escobar :D



    miércoles, 27 de junio de 2012 15:22

Respuestas

  • Hola Amigos:

    Hace semanas que publique esta pregunta sin obtener respuesta alguna, asi que me vi a la tarea de implementar un solucion temporal al problema que representaba en ese momento, les comento como fue que le di solucion:

    * A la BD le agregue una columna del tipo Boolean auxiliar llamada "Vigente, el cual estaria en 'True' cuando el precio de venta sea el vigente.

    * Al momento de actualizar (en realidad es insertar ya que no se actualizan precios para mantener un historial de precios del articulo) un precio se manda una consutla de actualizacion de este campo, la cual se encarga de poner el 'False' el campo auxiliar

    * Despues de agrega un nuevo registro con la nueva informacion y ponemos para este registro 'True' al campo "Vigente" para establecer este nuevo registro como precio vigente

    * De esta manera cuando se quiere conocer X cantidad de productos mas rentables ejecutaremos la siguiente consulta:

    SELECT TOP 6 Precios.num_articulo, Articulos.nom_articulo, Precios.Fecha_cambio, ((Precios.Costo/100)*Precios.Rentabilidad) AS Margen
    FROM Precios INNER JOIN Articulos ON Articulos.Num_articulo = Precios.Num_articulo
    WHERE Vigencia=True
    ORDER BY ((Precios.Costo/100)*Precios.Rentabilidad) DESC

    Esa fue la solucion temporal en ese momento pero creo que como la mayoria de ustedes hubiera echo, retome esa duda y comence a buscar soluciones no se si mas optimas pero quice sacarme la espina de hacerlo por medio de una consulta SQL. La cual despues de tanto intentar logre obtener, se las dejo aquie por si a alguien llega a interesarle algun dia.

    SELECT TOP 12 Precios.Num_articulo, Articulos.Nom_articulo, Costo, Rentabilidad,

    Fecha_cambio, ((Costo/100)*Rentabilidad) AS Ganancia FROM Precios INNER JOIN

    Articulos ON Articulos.Num_articulo = Precios.Num_articulo WHERE Fecha_Cambio

    IN (SELECT MAX(Fecha_cambio) FROM Precios GROUP BY Num_articulo) AND

    Articulos.Num_articulo IN (SELECT Num_articulo FROM Articulos

    ORDER BY Num_articulo DESC) ORDER BY ((Costo/100)*Rentabilidad) DESC

    De esta manera el campo "Vigente" resulta innecesario... :D

    Saludos desde Monterrey, N.L. México

    Luis Escobar :D



    martes, 31 de julio de 2012 16:54

Todas las respuestas

  • Hola a todos:

    Acualmente tengo una tabla en donde almaceno el historial de precios de un Articulo:

    Num_articulo, costo, porcentaje_incremento, fecha_cambio

    Requiero seleccionar los 10 producto mas rentables para lograr esto realizo una consulta de seleccion:

    "Select Top 10 Precios.Num_articulo, Precios.Costo, Precios.Rentabilidad, ((Precios.Costo*100)/Precios.Rentabilidad) AS Utilidad From Precios ORDER BY ((Precios.Costo*100)/Precios.Rentabilidad)DESC, Precios.Fecha_Cambio"

    Esta consulta me muestra 10 articulos pero no los mas rentables.

    Como dato adicional la tabla solo contiene un precio por fecha, es decir, el usuario no puede definir mas de un precio por dia, pero la tabla contiene muchos precios del articulo de diferentes dias.

    Agradesco cualquier ayuda!

    Saludos a todos!


    Luis Escobar :D



    martes, 26 de junio de 2012 20:52
  • Hola Enrique de nuevo gracias...

    Lastima que en estos momentos no pueda subir imagenes par mostrar el resultado, pero cuando ejecuto la consulta de ese modo me ordena el resultado pero jamas me discrimina las demas fechas, es decir, si para el articulo numero 1 yo tengo un cambio de precio en 04/05/2012, el 10/06/2012, el 25/06/2012 todos esos dias son mostrados. A lo que quiero llegar es que la consulta me muestre solo aquellos articulos mas rentables pero considerando solo la ultima fecha de cambio (que es el precio vigente), del ejemplo de arriba que me muestre por ejemplo solo el 25/06/2012.

    Creo que la primera vez no me explique bien Una disculpa por eso!

    Saludos y gracias!


    Luis Escobar :D

    martes, 26 de junio de 2012 22:15
  • Hola:

    En este link creo que su describo a detalle mi problema....

    http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/f34f97e9-634e-4d07-b36d-42f442eda4c6

    Gracias de nuevo!


    Luis Escobar :D


    jueves, 28 de junio de 2012 0:32
  • Hola Amigos:

    Hace semanas que publique esta pregunta sin obtener respuesta alguna, asi que me vi a la tarea de implementar un solucion temporal al problema que representaba en ese momento, les comento como fue que le di solucion:

    * A la BD le agregue una columna del tipo Boolean auxiliar llamada "Vigente, el cual estaria en 'True' cuando el precio de venta sea el vigente.

    * Al momento de actualizar (en realidad es insertar ya que no se actualizan precios para mantener un historial de precios del articulo) un precio se manda una consutla de actualizacion de este campo, la cual se encarga de poner el 'False' el campo auxiliar

    * Despues de agrega un nuevo registro con la nueva informacion y ponemos para este registro 'True' al campo "Vigente" para establecer este nuevo registro como precio vigente

    * De esta manera cuando se quiere conocer X cantidad de productos mas rentables ejecutaremos la siguiente consulta:

    SELECT TOP 6 Precios.num_articulo, Articulos.nom_articulo, Precios.Fecha_cambio, ((Precios.Costo/100)*Precios.Rentabilidad) AS Margen
    FROM Precios INNER JOIN Articulos ON Articulos.Num_articulo = Precios.Num_articulo
    WHERE Vigencia=True
    ORDER BY ((Precios.Costo/100)*Precios.Rentabilidad) DESC

    Esa fue la solucion temporal en ese momento pero creo que como la mayoria de ustedes hubiera echo, retome esa duda y comence a buscar soluciones no se si mas optimas pero quice sacarme la espina de hacerlo por medio de una consulta SQL. La cual despues de tanto intentar logre obtener, se las dejo aquie por si a alguien llega a interesarle algun dia.

    SELECT TOP 12 Precios.Num_articulo, Articulos.Nom_articulo, Costo, Rentabilidad,

    Fecha_cambio, ((Costo/100)*Rentabilidad) AS Ganancia FROM Precios INNER JOIN

    Articulos ON Articulos.Num_articulo = Precios.Num_articulo WHERE Fecha_Cambio

    IN (SELECT MAX(Fecha_cambio) FROM Precios GROUP BY Num_articulo) AND

    Articulos.Num_articulo IN (SELECT Num_articulo FROM Articulos

    ORDER BY Num_articulo DESC) ORDER BY ((Costo/100)*Rentabilidad) DESC

    De esta manera el campo "Vigente" resulta innecesario... :D

    Saludos desde Monterrey, N.L. México

    Luis Escobar :D



    martes, 31 de julio de 2012 16:54