none
Fecha-Movimiento RRS feed

  • Pregunta

  • Hola a Todos,

    quisiera saber como puedo poner la ultima transaccion que tuvieron todos mis articulo basado a la fecha,

    los tengo registrado por fecha, pero me estan apareciendo 2 veces, ya que como tuvieron movimiento en la fecha, solo quiero el ultimo movimiento generado en el dia.

    Gracias

    domingo, 20 de octubre de 2013 1:38

Respuestas

  • Necesitarás algún campo en el registro que permita discernir entre dos transacciones realizadas en la misma fecha, si ésta sólo graba la fecha. Si es un campo DateTime que graba también las horas, minutos, segundos y milisegundos, entonces puedes hacer algo de este estilo:

    select * from movimientos m1 where Fecha in (select max(Fecha) from movimientos m2 where m1.IdArticulo = m2.IdArticulo group by convert(date, fecha))

    Si sólo grabas año, mes y día en el campo fecha, entonces se necesita otro campo. Por ejemplo, si tienes un campo "IdMovimiento" de tipo Identity, que por lo tanto siempre es ascendente con la secuencia de movimientos, entonces puedes sacar los últimos movimientos así:

    select * from movimientos m1 where IdMovimiento in (select max(IdMovimiento) from movimientos m2 where m1.IdArticulo = m2.IdArticulo group by convert(date, fecha))

    domingo, 20 de octubre de 2013 8:26
    Moderador
  • Hola, Amigo

    Hay muchas formas de realizar esta consulta todo dependerá de la forma en que tengas tu diseño, te adjunto dos escenarios.

    El primero realizas una consulta con CTE agrupada por artículo y obtiene la última fecha de transacción y luego con eso realizas un JOIN y filtras el registro que te interesa.

    Codigo Ejemplo

    --Crear tabla de ejemplo
    --drop table #tmpVentas
    CREATE TABLE #tmpVentas(idventa int identity,idArticulo int,fecha datetime,valor float);
    --insertar registros pruebas
    --delete #tmpVentas
    INSERT INTO #tmpVentas(idArticulo,fecha,valor)
    VALUES
    (1,'2010-01-01',0357.01),
    (2,'2013-02-01',230357.01),
    (4,'2010-03-01',10357.01),
    (3,'2010-04-01',57.01),
    (1,'2014-05-01',57.01),
    (6,'2014-06-01',40357.01),
    (1,'2012-07-01',50357.01),
    (3,'2010-08-01',60357.01),
    (7,'2012-09-01',7.01),
    (9,'2013-10-01',357.01),
    (10,'2013-11-01',357.01),
    (3,'2011-12-01',5320357.01),
    (9,'2011-08-01',457.01),
    (1,'2013-09-01',67.01),
    (2,'2013-12-01',7.01);
    
    --primera forma utilizando un CTE
    with maxFecha (idArticulo,fecha)
    AS
    (
    	SELECT idArticulo,max(fecha) as fecha
    	FROM #tmpVentas
    	GROUP BY idArticulo
    )
    SELECT *
    FROM #tmpVentas as a 
    	INNER JOIN maxFecha as b
    	ON a.idArticulo=b.idArticulo AND a.fecha=b.fecha


    El segundo escenario asume que tu diseño tiene un campo para transacción y que este es único por cada transacción y que es autoincrementar, como el ejemplo, si es así te recomiendo utilizar mejor esta forma.

    El query utiliza un CTE para obtener la máxima transacción por articulo y luego realiza un filtro, a mi criterio es más eficiente filtrar por un entero que por fecha, J.

    --Crear tabla de ejemplo
    --drop table #tmpVentas
    CREATE TABLE #tmpVentas(idventa int identity,idArticulo int,fecha datetime,valor float);
    --insertar registros pruebas
    --delete #tmpVentas
    INSERT INTO #tmpVentas(idArticulo,fecha,valor)
    VALUES
    (1,'2010-01-01',0357.01),
    (2,'2013-02-01',230357.01),
    (4,'2010-03-01',10357.01),
    (3,'2010-04-01',57.01),
    (1,'2014-05-01',57.01),
    (6,'2014-06-01',40357.01),
    (1,'2012-07-01',50357.01),
    (3,'2010-08-01',60357.01),
    (7,'2012-09-01',7.01),
    (9,'2013-10-01',357.01),
    (10,'2013-11-01',357.01),
    (3,'2011-12-01',5320357.01),
    (9,'2011-08-01',457.01),
    (1,'2013-09-01',67.01),
    (2,'2013-12-01',7.01);
    
    --CTE
    with maxTran (idArticulo,idventa)
    AS
    (
    	SELECT idArticulo,max(idventa) as idventa
    	FROM #tmpVentas
    	GROUP BY idArticulo
    )
    SELECT *
    FROM #tmpVentas as a 
    	INNER JOIN maxTran as b
    	ON a.idArticulo=b.idArticulo AND a.idventa=b.idventa



    miércoles, 23 de octubre de 2013 15:44

Todas las respuestas

  • Necesitarás algún campo en el registro que permita discernir entre dos transacciones realizadas en la misma fecha, si ésta sólo graba la fecha. Si es un campo DateTime que graba también las horas, minutos, segundos y milisegundos, entonces puedes hacer algo de este estilo:

    select * from movimientos m1 where Fecha in (select max(Fecha) from movimientos m2 where m1.IdArticulo = m2.IdArticulo group by convert(date, fecha))

    Si sólo grabas año, mes y día en el campo fecha, entonces se necesita otro campo. Por ejemplo, si tienes un campo "IdMovimiento" de tipo Identity, que por lo tanto siempre es ascendente con la secuencia de movimientos, entonces puedes sacar los últimos movimientos así:

    select * from movimientos m1 where IdMovimiento in (select max(IdMovimiento) from movimientos m2 where m1.IdArticulo = m2.IdArticulo group by convert(date, fecha))

    domingo, 20 de octubre de 2013 8:26
    Moderador
  • Hola, Amigo

    Hay muchas formas de realizar esta consulta todo dependerá de la forma en que tengas tu diseño, te adjunto dos escenarios.

    El primero realizas una consulta con CTE agrupada por artículo y obtiene la última fecha de transacción y luego con eso realizas un JOIN y filtras el registro que te interesa.

    Codigo Ejemplo

    --Crear tabla de ejemplo
    --drop table #tmpVentas
    CREATE TABLE #tmpVentas(idventa int identity,idArticulo int,fecha datetime,valor float);
    --insertar registros pruebas
    --delete #tmpVentas
    INSERT INTO #tmpVentas(idArticulo,fecha,valor)
    VALUES
    (1,'2010-01-01',0357.01),
    (2,'2013-02-01',230357.01),
    (4,'2010-03-01',10357.01),
    (3,'2010-04-01',57.01),
    (1,'2014-05-01',57.01),
    (6,'2014-06-01',40357.01),
    (1,'2012-07-01',50357.01),
    (3,'2010-08-01',60357.01),
    (7,'2012-09-01',7.01),
    (9,'2013-10-01',357.01),
    (10,'2013-11-01',357.01),
    (3,'2011-12-01',5320357.01),
    (9,'2011-08-01',457.01),
    (1,'2013-09-01',67.01),
    (2,'2013-12-01',7.01);
    
    --primera forma utilizando un CTE
    with maxFecha (idArticulo,fecha)
    AS
    (
    	SELECT idArticulo,max(fecha) as fecha
    	FROM #tmpVentas
    	GROUP BY idArticulo
    )
    SELECT *
    FROM #tmpVentas as a 
    	INNER JOIN maxFecha as b
    	ON a.idArticulo=b.idArticulo AND a.fecha=b.fecha


    El segundo escenario asume que tu diseño tiene un campo para transacción y que este es único por cada transacción y que es autoincrementar, como el ejemplo, si es así te recomiendo utilizar mejor esta forma.

    El query utiliza un CTE para obtener la máxima transacción por articulo y luego realiza un filtro, a mi criterio es más eficiente filtrar por un entero que por fecha, J.

    --Crear tabla de ejemplo
    --drop table #tmpVentas
    CREATE TABLE #tmpVentas(idventa int identity,idArticulo int,fecha datetime,valor float);
    --insertar registros pruebas
    --delete #tmpVentas
    INSERT INTO #tmpVentas(idArticulo,fecha,valor)
    VALUES
    (1,'2010-01-01',0357.01),
    (2,'2013-02-01',230357.01),
    (4,'2010-03-01',10357.01),
    (3,'2010-04-01',57.01),
    (1,'2014-05-01',57.01),
    (6,'2014-06-01',40357.01),
    (1,'2012-07-01',50357.01),
    (3,'2010-08-01',60357.01),
    (7,'2012-09-01',7.01),
    (9,'2013-10-01',357.01),
    (10,'2013-11-01',357.01),
    (3,'2011-12-01',5320357.01),
    (9,'2011-08-01',457.01),
    (1,'2013-09-01',67.01),
    (2,'2013-12-01',7.01);
    
    --CTE
    with maxTran (idArticulo,idventa)
    AS
    (
    	SELECT idArticulo,max(idventa) as idventa
    	FROM #tmpVentas
    	GROUP BY idArticulo
    )
    SELECT *
    FROM #tmpVentas as a 
    	INNER JOIN maxTran as b
    	ON a.idArticulo=b.idArticulo AND a.idventa=b.idventa



    miércoles, 23 de octubre de 2013 15:44