none
¿Hacer una consulta en SQL SERVER que me muestre solo la ultima fecha en que se registro cada producto, pero que sea de un almacén en especifico? RRS feed

  • Pregunta

  • Buen día

    Tengo la siguiente tabla con estos datos de ejemplo:

    CREATE TABLE productos_2020 (
                        id INT NOT NULL PRIMARY KEY IDENTITY,
                        producto_id INT,
                        nombre_producto NVARCHAR(30),
                        almacen NVARCHAR(30),
                        fecha DATETIME NOT NULL
            );
    
    
    
      INSERT INTO productos_2020 (producto_id, nombre_producto, almacen, fecha)
            VALUES 
            (8,'MANZANA','TMDB','2020-09-20 00:00:00'),
            (8,'MANZANA','TMPPIC','2020-09-15 21:00:00'),
            (8,'MANZANA','TMDB','2020-09-16 22:00:00'),
            (8,'MANZANA','TMDB','2020-09-16 22:01:00'),
            (8,'MANZANA','TMPPIC','2020-09-18 21:00:00'),
            (1,'UVA','TMDB','2020-09-15 21:00:00'),
            (1,'UVA','TMDB','2020-09-15 21:15:00'),
            (1,'UVA','TMPPIC','2020-09-15 21:15:00'),
            (1,'UVA','TMDB','2020-09-15 21:15:20'),
            (1,'UVA','TMDB','2020-09-15 21:15:00'),
            (1,'UVA','TMC','2020-09-15 21:15:00'),
            (1,'UVA','TMAG','2020-09-15 21:16:00'),
            (1,'UVA','TMAG','2020-09-15 21:17:00'),
            (1,'UVA','TMAG','2020-09-15 21:17:01'),
            (2,'NARANJA','TMDB','2020-09-15 21:00:00'),
            (2,'NARANJA','TMPPIC','2020-09-18 23:00:00'),
            (2,'NARANJA','TMDB','2020-09-16 21:00:00'),
            (2,'NARANJA','TMPPIC','2020-09-17 23:00:00'),
            (2,'NARANJA','TMDB','2020-09-19 21:00:00'),
            (2,'NARANJA','TMDB','2020-09-19 21:00:01'),
            (2,'NARANJA','TMPPIC','2020-09-18 23:00:10'),
            (2,'NARANJA','TMDB','2020-09-18 23:01:00'),
            (3,'PERA','TMAG','2020-09-15 22:00:00'),
            (3,'PERA','TMDB','2020-09-16 21:00:10'),
            (3,'PERA','TMPPIC','2020-09-16 21:30:10'),
            (3,'PERA','TMAG','2020-09-14 22:00:00'),
            (3,'PERA','TMDB','2020-09-16 21:10:00'),
            (3,'PERA','TMAG','2020-09-15 22:00:00'),
            (3,'PERA','TMDB','2020-09-16 21:00:00'),
            (3,'PERA','TMPPIC','2020-09-16 21:31:10')
          ;

    Lo que necesito es mostrar solo la última fecha en que se registro cada uno de los productos (Sin repetir el producto), siempre y cuando sean del almacen "TMDB", si la ultima fecha del producto no es del almacen "TMDB" que no lo muestre.

    Muchas gracias y saludos, espero me puedan ayudar

    martes, 14 de julio de 2020 21:00

Todas las respuestas

  • ¿Esta consulta ya la habías colocado?

    IIslas Master Consultant SQL Server

    miércoles, 15 de julio de 2020 0:34
  • Hola halt60:

    Puedes utilizar una tabla de expresión común donde por un lado coges todos los productos del almacén "TMDB" con sus fechas, luego la máxima fecha por producto y relacionas ambos conjuntos para obtener los que coinciden.

    with cte
    	 as (Select p.producto_id
    			  , p.nombre_producto
    			  , P.fecha
    			  , p.almacen
    				from productos_2020 AS p
    				where p.almacen = 'TMDB'),
    	 maxfecha
    	 AS (Select MAX(S.FECHA) AS FECHA
    			  , S.producto_id
    				FROM productos_2020 AS S
    				GROUP BY S.producto_id)
    	 SELECT c.*
    			FROM CTE AS C
    					  INNER JOIN maxfecha AS M ON C.producto_id = M.producto_id AND C.fecha = M.FECHA;

    Salida

    Tablas de expresión común correlativas.

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-2-correlativos/

    miércoles, 15 de julio de 2020 1:35
  • Si además quieres también todos los productos, pero con la fecha solo si es de ese almacén.

    with cte
    	 as (Select p.producto_id
    			  , p.nombre_producto
    			  , P.fecha
    			  , p.almacen
    				from productos_2020 AS p
    				where p.almacen = 'TMDB'),
    	 maxfecha
    	 AS (Select MAX(S.FECHA) AS FECHA
    			  , S.producto_id
    				FROM productos_2020 AS S
    				GROUP BY S.producto_id),
    	 productos as (
    		Select distinct producto_id,
    		nombre_producto
    		from productos_2020
    	 )
    	 SELECT productos.*, c.fecha
    			FROM 
    			productos Left join 
    				(CTE AS C 
    					  INNER JOIN maxfecha AS M ON C.producto_id = M.producto_id AND C.fecha = M.FECHA) on productos.producto_id = c.producto_id

    Salida

    Left join sin perder registros

    https://javifer2.wordpress.com/2019/09/01/left-join-entender-la-combinacion-de-izquierda-y-no-perder-registros/

    miércoles, 15 de julio de 2020 3:03