none
TSQL Instruccion Case

    Question

  • Trabajo con SqlServer 2008 R2.

    .- Cuando le pongo la condición de "and e.CodigoEmpresa=case when e.CodigoEmpresa  IS null then null else e.CodigoEmpresa end", si el valor de e.codigoempresa es null, e.codigoempresa=null no funciona. Quiero que si e.codigoempresa is null, pueda decir en el where e.codigoempresa=null ( e.codigoempresa is null). Como puedo hacer esto ? con la instrucción case ?

    select e.CodigoEmpresa, a.Codigo, a.Descripcion,'PrecioMedio'= case when e.preciomedio is null then a.preciomedio else e.preciomedio end

    from Articulos a

    left join ArticulosValoracionExistencias e

    on a.Codigo=E.CodigoArticulo 

    where a.codigo='iep5330216' and e.CodigoEmpresa=case when e.CodigoEmpresa  IS null then null else e.CodigoEmpresa end

    Muchas gracias.

    Tuesday, December 27, 2011 3:14 PM

Answers

  • --Asumiendo que la tabla Articulos contiene el 100% de los códigos de artículo,
    --o dicho de otra forma, asumiendo que los códigos de artículo guardados en
    --ArticulosValoracionExistencias es un subconjunto de los códigos en la tabla Artículos:
    Select
        a.Codigo
        , e.CodigoEmpresa
        , Case When e.PrecioMedio Is Null Then a.PrecioMedio Else e.PrecioMedio End As [PrecioMedio]
    From
        Articulos As a
        Left Join
        ArticulosValoracionExistencias As e
        On a.Codigo = e.CodigoArticulo
    --Opcionalmente cualquier Where que necesite...
    

     

    Creo que eso debería bastar.


    Jose R. MCP
    • Marked as answer by cabusia Thursday, December 29, 2011 3:02 PM
    Tuesday, December 27, 2011 5:03 PM

All replies

  • Hola.

    Como sabrás, la condicion null=null nunca se cumple (null no es igual a null). Pero de todos modos, no veo qué es lo que quieres implementar, ya que no se aplicaría nunca ningún filtro, ni cuando sea nulo ni cuando no lo sea. ¿Podrías explicar qué registros NO quieres que salgan (a lo mejor así lo entendemos)? Y el left join tampoco ayuda, no sé si lo que buscas es que te salgan los artículos que no tienen su referencia en ArticulosValoracionExistencias.

     

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    Tuesday, December 27, 2011 3:26 PM
    Moderator
  • Lo que dice Alberto es correcto siempre y cuando no se altere la propiedad ANSI_NULLS que puede cambiar el comportamiento de la comparativa en cuestión.  Pero más allá de ese detalle, lo que veo aquí en ese case es "and ALGO = ALGO".  O sea, por supuesto que algo siempre es igual a sí mismo (asumiendo que ANSI_NULLS fue corregido).  ¿Qué quiere lograr con esto?

    Jose R. MCP

    Tuesday, December 27, 2011 3:35 PM
  • Hola ... 

     

    Me explico mejor. 

     

    Tengo 2 tablas: 

    .Articulos:

    Codigo, PrecioMedio

    En esta tabla estan todos los articulos con un precio medio

    .ArticulosValoracionExistencias: 

    codigoempresa,codigo, PrecioMedio

    En esta tabla solo hay algunos de los articulos de la tabla de articulos con otro preciomedio.

    Tengo que hacer un listado que tenga: 

    codigoempresa, codigoarticulo, preciomedio

    Si el articulo de la tabla ArticulosValoracionExistencias tiene preciomedio este es el que vale pero si no hay ningún registro en esta tabla, tengo que coger el precio medio de la tabla de articulos. 

    La tabla de articulos no tiene codigo de empresa. 

    Al final he optado por estas  2consultas:

    son correctas ?

    Muchas gracias por todo.

    select  a.Codigo, a.Descripcion, 'PrecioMedio'= case when v.preciomedio is null then a.preciomedio else v.preciomedio end 

    from Articulos a

    left join (Select *

    from ArticulosValoracionExistencias e

    where e.CodigoArticulo='iep5330216' and e.CodigoEmpresa='gi') v on a.Codigo=v.CodigoArticulo 

    where a.codigo='iep5330216'



    select  a.Codigo, a.Descripcion,a.NoInventariar ,a.obsoleto, 

      'PrecioMedio' = case when (select preciomedio from ArticulosValoracionExistencias where CodigoArticulo='iep5330216'  and CodigoEmpresa='gi') 

       IS NULL  then a.PrecioMedio else 

       (select preciomedio from ArticulosValoracionExistencias where CodigoArticulo='iep5330216' and CodigoEmpresa='gi') end 

       from Articulos a 

       where a.Codigo='iep5330216'



     

     

     

     

     


     

     

     

    Tuesday, December 27, 2011 4:34 PM
  • Hola. Además de lo que dicen Alberto y José, sugiero analizar si para tu situación, y disculpa lo especulativo, no sería mejor que usaras lo que se conoce como un "dummy code" o un código que permita identificar una empresa no relacionada en tu sistema pero que igual requieres codificarla porque, como muestras, presentas situaciones en donde quieres obtener artículos que no tienen empresa asociada en la tabla ArticulosValoracionExistencias.

    Gracias y saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    Tuesday, December 27, 2011 4:45 PM
  • --Asumiendo que la tabla Articulos contiene el 100% de los códigos de artículo,
    --o dicho de otra forma, asumiendo que los códigos de artículo guardados en
    --ArticulosValoracionExistencias es un subconjunto de los códigos en la tabla Artículos:
    Select
        a.Codigo
        , e.CodigoEmpresa
        , Case When e.PrecioMedio Is Null Then a.PrecioMedio Else e.PrecioMedio End As [PrecioMedio]
    From
        Articulos As a
        Left Join
        ArticulosValoracionExistencias As e
        On a.Codigo = e.CodigoArticulo
    --Opcionalmente cualquier Where que necesite...
    

     

    Creo que eso debería bastar.


    Jose R. MCP
    • Marked as answer by cabusia Thursday, December 29, 2011 3:02 PM
    Tuesday, December 27, 2011 5:03 PM
  • Que es un   "dummy code" ?

     

    Gracias

    Wednesday, December 28, 2011 11:00 AM
  • Gracias
    Wednesday, December 28, 2011 11:01 AM
  • Hola. Un "dummy code" es un código que se usa mucho en escenarios tipo Business Intelligence en donde hay una tabla, como te decía, de empresas que proveen un artículo, pero hay ocasiones en las cuales dicho artículo no se puede relacionar con alguna empresa, entonces en lugar de usar NULL se usa un valor que no está asignado como código de empresa, generalmente cero (0). Esto permite que para esa empresa "no relacionada" o "no existente" se puedan hacer consultas vía T-SQL comparando contra ese valor de "dummy code".

    Lo propuse porque tal vez sea más fácil, adicional a lo que te propone José, que no se si has probado ya.

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    Wednesday, December 28, 2011 2:05 PM