none
Consulta Select Union RRS feed

  • Pregunta

  • Hola! quisiera ver si me pueden ayudar, yo tengo 2 tablas de materiales en una bonificaciones por grupo y en la segunda tengo bonificación por material, esta 2da tabla solo se agregan materiales puntuales, mi problema reside en que formulo un select union para unir las 2 tablas pero me genera duplicados agregandome 1 material repetido con 2 bonificaciones, como puedo hacer para que solo me traiga los datos de la bonificacion del grupo y solo si existe bonificacion de material me pise la anterior?

    SELECT  BONI_GRUPO.IDMaterial, BONI_GRUPO.Boni_GRUPO
    FROM BONI_GRUPO
    UNION SELECT BONI_MATERIAL.IDMaterial,BONI_MATERIAL.Boni_MATERIAL

    FROM BONI_MATERIAL;

    tabla 1
    IDMaterial ID_GRUPO Boni_GRUPO
    130393 GV126 0,49402
    129841 GV030 0,33403
    tabla 2
    IDMaterial ID_GRUPO Boni_MATERIAL
    129841 GV030 0,36517
    Resultado buscado, si existe boni_material traerlo sino traer la de grupo
    Consulta 1
    IDMaterial ID_GRUPO Boni_APLICADA
    130393 GV126 0,49402
    129841 GV030 0,36517



    miércoles, 24 de enero de 2018 18:54

Respuestas

  • Trata:

    - Q1
    with R as (
    select idmaterial, boni_grupo, row_number() over(partition by idmaterial order by grp_mat) as rn
    from
    (
    select idmaterial, boni_grupo, 1 as grp_mat from boni_grupo
    union all
    select idmaterial, boni_material, 2 as grp_mat from boni_material
    ) as T
    )
    select *
    from R
    where rn = 1;

    La idea es enumerar las filas por idmaterial en orden del valor de [grp_mat] y escoger solo la primera de cada grupo.  Si un idmaterial solo tiene bono de grupo entonces escogera esa fila, si tiene solo bono de material entonces esa fila y si tiene ambos entonces escogera la fila del bono de grupo.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    miércoles, 24 de enero de 2018 20:58
  • Probe esta opción y access 2016 me da el siguiente mensaje "la funcion coalesce no esta definida en la expresión"

    Pero este foro es acerca de SQL Server.

    Pruebe a sustituir
         coalesce(BM.Boni_MATERIAL, BG.Boni_GRUPO)
    por
         IIF(BM.Boni_MATERIAL is null, BG.Boni_GRUPO, M.Boni_MATERIAL)


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Gracias a todos, lo pude resolver con esto=

    SELECT BONI_MATERIAL.IDMaterial,BONI_MATERIAL.Boni_MATERIAL

    FROM BONI_MATERIAL
    UNION
    SELECT BONI_GRUPO.IDMaterial, BONI_GRUPO.Boni_GRUPO
    FROM BONI_GRUPO
    WHERE BONI_GRUPO.IDMaterial not IN (select BONI_MATERIAL.IDMaterial FROM BONI_MATERIAL)

    abrazo a todos!

    jueves, 25 de enero de 2018 21:36

Todas las respuestas

  • Deleted
    miércoles, 24 de enero de 2018 20:56
  • Trata:

    - Q1
    with R as (
    select idmaterial, boni_grupo, row_number() over(partition by idmaterial order by grp_mat) as rn
    from
    (
    select idmaterial, boni_grupo, 1 as grp_mat from boni_grupo
    union all
    select idmaterial, boni_material, 2 as grp_mat from boni_material
    ) as T
    )
    select *
    from R
    where rn = 1;

    La idea es enumerar las filas por idmaterial en orden del valor de [grp_mat] y escoger solo la primera de cada grupo.  Si un idmaterial solo tiene bono de grupo entonces escogera esa fila, si tiene solo bono de material entonces esa fila y si tiene ambos entonces escogera la fila del bono de grupo.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    miércoles, 24 de enero de 2018 20:58
  • muchas gracias por la respuesta, ahi agregue un ejemplo de lo que necesito para que quede mas claro, gracias!
    jueves, 25 de enero de 2018 0:21
  • No sé si comprendí correctamente el problema, pues la puntuación en el texto me pareció incompleta y confusa.

    Considerando la frase "(...) como puedo hacer para que solo me traiga los datos de la bonificacion del grupo y solo si existe bonificacion de material me pise la anterior (...)", he aquí una sugerencia:

    -- código #1 v2
    SELECT BG.IDMaterial, coalesce(BM.Boni_MATERIAL, BG.Boni_GRUPO) as Bonificación
      from BONI_GRUPO as BG
           left join BONI_MATERIAL as BM on BM.IDMaterial = BG.IDMaterial;
     


    e-mail       José Diz     Belo Horizonte, MG - Brasil





    Probe esta opción y access 2016 me da el siguiente mensaje "la funcion coalesce no esta definida en la expresión"
    jueves, 25 de enero de 2018 2:47
  • Deleted
    jueves, 25 de enero de 2018 9:15
  • Probe esta opción y access 2016 me da el siguiente mensaje "la funcion coalesce no esta definida en la expresión"

    Pero este foro es acerca de SQL Server.

    Pruebe a sustituir
         coalesce(BM.Boni_MATERIAL, BG.Boni_GRUPO)
    por
         IIF(BM.Boni_MATERIAL is null, BG.Boni_GRUPO, M.Boni_MATERIAL)


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Gracias a todos, lo pude resolver con esto=

    SELECT BONI_MATERIAL.IDMaterial,BONI_MATERIAL.Boni_MATERIAL

    FROM BONI_MATERIAL
    UNION
    SELECT BONI_GRUPO.IDMaterial, BONI_GRUPO.Boni_GRUPO
    FROM BONI_GRUPO
    WHERE BONI_GRUPO.IDMaterial not IN (select BONI_MATERIAL.IDMaterial FROM BONI_MATERIAL)

    abrazo a todos!

    jueves, 25 de enero de 2018 21:36