none
Remplazo en Query - Logica RRS feed

  • Pregunta

  • Buenas tardes a todos,

    Tengo el siguiente problema y le he dado algunas vueltas y aun no puedo resolverlo, qui va.

    Tengo la siguiente tabla llamada productos, la tabla contiene el id, precio y Poc. Siendo el poc el lugar donde se encuentra el producto, de estos poc hay dos tipos, los que están en las neveras o los que están fuera de ellas.

    43 --> fuera de las neveras

    44 --> en las neveras.

    Pongo un ejemplo (screen) de la estructura de la tabla para un caso particular.

    Si se dan cuenta el código del producto se repite debido al campo poc (no en todos los casos), lo que se busca es que siempre que vengan los productos en el poc 44 (neveras) se tome el precio correspondiente a neveras (pocid = 44) y se descarte el precio de poc ambiente (pocid = 43). El siguiente escenario es que siempre que no haya registros en poc nevera (pocid = 44) par aun producto, se tome el precio de poc ambiente (pocid = 43), y por supuesto entonces al final solo quede un listado de porductos con su correspondiente precio y sin que estos se repitan.

    El reto del query es realmente hacerlo en una sola consulta tomando como base la tabla (screen) que adjunte, sin implementar ctes u otras tablas temporales.

    Para ayudar un poco mas se busca un resultado como el siguiente.

    Espero puedan ayudarme!! Saludos.

     

    lunes, 2 de septiembre de 2019 20:24

Respuestas

  • Se me ocurre la siguiente chapucilla:

    select * from laTabla where pocid = 44
    union all
    select * from laTabla as a where pocid = 43
       and not exists (
          select 1 from laTabla as b
             where b.producto=a.producto and pocid=44)


    lunes, 2 de septiembre de 2019 20:33
  • Hola SantiagoMorales15:

    Escenario:

    create table productos (id varchar(10), precio decimal (4,1), pocid int)
    go
    insert into productos (id, precio, pocid)
    values
    ('00110064',2.5,43),
    ('00180051',1.2,43),
    ('00180051',1.2,44),
    ('00180064',2.5,44),
    ('00180064',2.5,43),
    ('00180119',3.5,43),
    ('00180119',3.5,44),
    ('00180122',0.9,43),
    ('00180122',0.9,44),
    ('00180172',5.5,43),
    ('00180172',5.5,44),
    ('01210068',1.5,43),
    ('01210068',1.5,44),
    ('02900051',1.2,43),
    ('02900051',1.2,44);
    GO

    Otra posible solución:

        SELECT id AS producto, 
               44 AS Pocid, 
               PRECIO AS precio
        FROM productos
        WHERE pocid = 44
        INTERSECT
        SELECT id, 
               44, 
               PRECIO
        FROM productos
        WHERE pocid = 43
    
    UNION ALL
    
        SELECT id, 
               43 AS PocId, 
               PRECIO
        FROM productos
        WHERE POCID = 43
        EXCEPT
        SELECT id, 
               43, 
               PRECIO
        FROM productos
        WHERE POCID = 44;

    Salida

    lunes, 2 de septiembre de 2019 20:56
  • Deleted
    lunes, 2 de septiembre de 2019 23:20

Todas las respuestas

  • Se me ocurre la siguiente chapucilla:

    select * from laTabla where pocid = 44
    union all
    select * from laTabla as a where pocid = 43
       and not exists (
          select 1 from laTabla as b
             where b.producto=a.producto and pocid=44)


    lunes, 2 de septiembre de 2019 20:33
  • Hola SantiagoMorales15:

    Escenario:

    create table productos (id varchar(10), precio decimal (4,1), pocid int)
    go
    insert into productos (id, precio, pocid)
    values
    ('00110064',2.5,43),
    ('00180051',1.2,43),
    ('00180051',1.2,44),
    ('00180064',2.5,44),
    ('00180064',2.5,43),
    ('00180119',3.5,43),
    ('00180119',3.5,44),
    ('00180122',0.9,43),
    ('00180122',0.9,44),
    ('00180172',5.5,43),
    ('00180172',5.5,44),
    ('01210068',1.5,43),
    ('01210068',1.5,44),
    ('02900051',1.2,43),
    ('02900051',1.2,44);
    GO

    Otra posible solución:

        SELECT id AS producto, 
               44 AS Pocid, 
               PRECIO AS precio
        FROM productos
        WHERE pocid = 44
        INTERSECT
        SELECT id, 
               44, 
               PRECIO
        FROM productos
        WHERE pocid = 43
    
    UNION ALL
    
        SELECT id, 
               43 AS PocId, 
               PRECIO
        FROM productos
        WHERE POCID = 43
        EXCEPT
        SELECT id, 
               43, 
               PRECIO
        FROM productos
        WHERE POCID = 44;

    Salida

    lunes, 2 de septiembre de 2019 20:56
  • Deleted
    lunes, 2 de septiembre de 2019 23:20
  • Muchas gracias a todos,

    He probado las opciones y todas muy validas gracias por toda su ayuda.

    Saludos,

    Santiago Morales

    martes, 3 de septiembre de 2019 20:39