none
DATOS DUPLICADOS DE LA TABLA HIJA, AL MOSTRAR DATOS EN LA DE LA TABLA PADRE RRS feed

  • Pregunta

  • BUENAS, TENGO UNA DUDA Y UN PROBLEMA A LA VEZ, MI PREGUNTA ES SI ES POSIBLE MOSTRAR DATOS DE UNA TABLA PADRE CON LAS RELACIONES DE LA TABLA HIJA, PERO... QUE LA TABLA HIJA CONTIENE DATOS REPETITIVOS DE LA TABLA PADRE. EN MI EJEMPLO TENGO UNA BD DE INVENTARIOS Y QUIERO SABER SI ES POSIBLE.

    EJEMPLO:

    SELECT MAX(ID_INVENTARIO)AS ID_INVENTARIO,I.ID_PRODUCTO,P.CODIGO,P.CATEGORIA,
    P.AUTO,P.MODELO,P.DESCRIPCION,P.MARCA,I.COSTO,I.PRECIO,I.FECHA AS FECHA_INGRESO,I.SALDO,I.CANTIDAD,
    (I.SALDO+I.CANTIDAD)AS TOTAL_INGRESO,I.STOCK AS STOCK_ACTUAL
    FROM INVENTARIO I 
    INNER JOIN PRODUCTO P ON P.ID_PRODUCTO = I.ID_PRODUCTO
    GROUP BY I.ID_INVENTARIO,I.ID_PRODUCTO,P.CODIGO,P.CATEGORIA,
    P.AUTO,P.MODELO,P.DESCRIPCION,P.MARCA,I.COSTO,I.PRECIO,I.FECHA,I.SALDO,I.CANTIDAD,I.STOCK
    ORDER BY I.ID_INVENTARIO DESC

    Y EL RESULTADO ES LO SIGUIENTE...

    ID_INVENTARIO   ID_PRODUCTO  ............

    27                       22

    26                       22

    25                       21

    24                       20

    COMO SE PUEDE OBSERVAR... Y QUIERO QUE NO SE REPITA LOS DATOS DEL CODIGO 22, SI NO MAS BIEN EL ULTIMO DATO REGISTRADO DE CADA DATO EN LA TABLA PADRE...

    ES POSIBLE?

    martes, 5 de febrero de 2019 6:04

Todas las respuestas

  • Si lo que quieres es obtener un registro por cada ID_PRODUCTO y que sea el de mayor valor de ID_INVENTARIO modifica la clausula Group By:

    SELECT MAX(ID_INVENTARIO)AS ID_INVENTARIO,I.ID_PRODUCTO,P.CODIGO,P.CATEGORIA,
    P.AUTO,P.MODELO,P.DESCRIPCION,P.MARCA,I.COSTO,I.PRECIO,I.FECHA AS FECHA_INGRESO,I.SALDO,I.CANTIDAD,
    (I.SALDO+I.CANTIDAD)AS TOTAL_INGRESO,I.STOCK AS STOCK_ACTUAL
    FROM INVENTARIO I 
    INNER JOIN PRODUCTO P ON P.ID_PRODUCTO = I.ID_PRODUCTO
    GROUP BY I.ID_PRODUCTO 
    ORDER BY I.ID_INVENTARIO DESC


    Saludos, Javier J

    martes, 5 de febrero de 2019 7:53
  • hola amigo, podes probar algo asi obteniento del maximo ID_INVENTARIO 

    declare @tablaPadre table ( id_producto int )
    declare @tablaInventacio table
        (
          ID_INVENTARIO int ,
          id_producto int
        )
    
    insert  into @tablaPadre
            ( id_producto )
    values  ( 20  -- id_producto - int
              )
    
    insert  into @tablaPadre
            ( id_producto )
    values  ( 21  -- id_producto - int
              )
              
    insert  into @tablaPadre
            ( id_producto )
    values  ( 22  -- id_producto - int
              )
    insert  into @tablaInventacio
            ( ID_INVENTARIO, id_producto )
    values  ( 24, -- ID_INVENTARIO - int
              20  -- id_producto - int
              )
    insert  into @tablaInventacio
            ( ID_INVENTARIO, id_producto )
    values  ( 25, -- ID_INVENTARIO - int
              21  -- id_producto - int
              )                 
    
    insert  into @tablaInventacio
            ( ID_INVENTARIO, id_producto )
    values  ( 26, -- ID_INVENTARIO - int
              22  -- id_producto - int
              )    
    
    insert  into @tablaInventacio
            ( ID_INVENTARIO, id_producto )
    values  ( 27, -- ID_INVENTARIO - int
              22  -- id_producto - int
              )   
    
    select  ti.*
    from    @tablaPadre as tp
            join ( select   max(ID_INVENTARIO) as ID_INVENTARIO,
                            tin.id_producto
                   from     @tablaInventacio tin
                   group by tin.id_producto
                 ) ti on ti.id_producto = tp.id_producto
    order by 1 desc                                                        

    Resultado


    ID_INVENTARIO id_producto
    27               22
    25                21
    24                20

    Bader Molinas 

    Paraguay




    • Editado Bader Molinas martes, 5 de febrero de 2019 12:55
    • Propuesto como respuesta Pedro Alfaro martes, 5 de febrero de 2019 15:21
    martes, 5 de febrero de 2019 12:49
  • BUEN DIA, JAVIER JIMENEZ. SI YA LO HABIA MODIFICADO DE TANTAS FORMAS Y SIEMPRE ME SALIA ESE PROBLEMA, GRACIAS POR EL APORTE, ME SIRVIO PARA OTRAS IDEAS. AUNQUE PUDE SOLUCIONARLO DE OTRA FORMA:

    SEGUN LO QUE ME SUGIRIO QUEDABA ASI, 

    SELECT I.ID_PRODUCTO,MAX(ID_INVENTARIO)AS ID_INVENTARIO
    FROM INVENTARIO I 
    INNER JOIN PRODUCTO P ON P.ID_PRODUCTO = I.ID_PRODUCTO
    GROUP BY I.ID_PRODUCTO ,I.ID_INVENTARIO
    ORDER BY I.ID_INVENTARIO DESC

    LO HE ESTADO CAMBIANDO Y TRATE DE QUE ME SAQUE COMO DOMINANTE EL ID_PRODUCTO Y COMO SECUNDARIA EL ID_INVENTARIO, Y DE IGUAL FORMA ME MUESTRA LO SIGUIENTE.....

    ID_PRODUCTO, ID_INVENTARIO

    (22)       29

    23       28

    (22)       26

    21       25

    20       24

    19       23

    18       22

    Y SIGUE REPITIENDO EL ID_PRODUCTO.... EL 22 O CUALQUIER OTRO ID_PRODUCTO QUE CONTENGA MAS DATOS EN LA TABLA DE INVENTARIOS...

    martes, 5 de febrero de 2019 21:04
  • Hola Guillermo Cristofher:

    Tu evolución de las consultas que te han orientado, tanto Javier, como Bader, no es correcta.

    Te expongo un escenario con valores repetidos.

    Create table Inventario (id_inventario int identity(1,1), fecha datetime, id_producto int)
    go
    create table Producto (id_producto int, descripcion varchar(100));
    go
    Insert into Producto(id_producto, descripcion)
    values
    (1,'a'),
    (2,'b'),
    (3,'c'),
    (4,'d'),
    (5,'e')
    go
    insert into Inventario (fecha, id_producto)
    values
    ('20190101',1),
    ('20190101',2),
    ('20190101',3),
    ('20190101',1),
    ('20190102',1),
    ('20190102',1),
    ('20190102',2),
    ('20190102',3),
    ('20190102',4),
    ('20190102',5),
    ('20190103',1),
    ('20190103',2),
    ('20190103',3),
    ('20190103',3),
    ('20190103',1);
    go

    Si observas los datos, el día 1 y 3 se repite el producto 1, y el dia 3 se repite el producto 3.

    SELECT I.ID_PRODUCTO, 
           MAX(ID_INVENTARIO) AS ID_INVENTARIO
    FROM INVENTARIO I
         INNER JOIN PRODUCTO P ON P.ID_PRODUCTO = I.ID_PRODUCTO
    GROUP BY I.ID_PRODUCTO
    ORDER BY ID_INVENTARIO DESC;

    Si te fijas en la consulta, es la tuya, con dos anotaciones.

    • Group by: No puedes agrupar por la columna que utilizas como max, porque entonces no agrupa.
    • Order by: Cuando el conjunto llega a order by no existe i, solo existen las columnas por sus alias. Por tanto no es i.ID_Inventario, sino ID_INVENTARIO, que es como se ha llamado por el alias AS ID_INVENTARIO.

    Salida

    Si observas la consulta de Bader Molinas, en la parte del conjunto interior que va entre paréntesis después del join, es la misma. Luego en el conjunto exterior obtiene la información completa de la tabla interior, pero tiene a tu disposición toda la información de la tabla de inventarios.

    Si este resultado no es satisfactorio, porque no te sale, creo que deberías de exponer tus columnas y datos, para que podamos ver que es lo que esta mal.

    Unas pocas filas, donde se incluyan las variantes que te dan problemas.

    • Propuesto como respuesta Pedro Alfaro jueves, 7 de febrero de 2019 21:00
    jueves, 7 de febrero de 2019 5:37