none
Case when com varias condiçoes. RRS feed

  • Pergunta

  • Prezados, boa tarde.

    estou tentando criar uma consulta, que é uma data, na qual o resultado pode vir de 7 campos na mesma tabela. mas pra variar estou tomando uma coça.

    então vem a pergunta  case when seria o mais indicado ?

    hoje eu tenho esta consulta abaixo, mas preciso enquadrar ( avesc/sgso/art.peri/crm/carg.ext e transp enfermos em vool e solol  para que caso N/A que é a descTreina seja null carrege por exemplo o resultado de Avesc. 

    SELECT  N.id, N.NomePiloto as NomePilotol, N.Modelonome as Equipamento, 
    stuff ((SELECT ', ' + T.descTreina from Tbl_NRTespecifico as T where T.id_nrt = N.id order by T.descTreina  for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') as cursos,
     max(  case when NE.descTreina = 'AVSEC' then DATEADD(dd, NE.tempo,N.DatInicial) end) av,
     max(case when NE.descTreina = 'SGSO' then  DATEADD(dd, NE.tempo,N.DatInicial) end )sg, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,Se.Dtfinal) end )vool, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,N.DatFinal) end )solol ,
     max (case when NE.descTreina = 'ART. PERIGOSOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end )art,
     max(case when NE.descTreina = 'CRM' then  DATEADD(dd, NE.tempo,N.DatInicial) end )cmri, 
     max(case when NE.descTreina = 'CARG. EXTERNA' then  DATEADD(dd, NE.tempo,N.DatInicial) end) care,
      max(case when NE.descTreina = 'TRANSP. ENFERMOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end) traenf
       from Tbl_NRT as N left join Tbl_NRTespecifico as NE on NE.id_nrt = N.id  
       left join Tbl_SAE as Se on Se.id_NRT = N.Id where N.Ativo ='A' and N.Decricao = 'examinador' 
     group by N.id, N.NomePiloto, N.Modelonome  order by N.NomePiloto asc

    Vool compara com uma data de outra tbl mesmo. 

    Agradeço desde já quem puder ajudar.

    Att, Ricardo.

    quarta-feira, 25 de novembro de 2020 20:46

Respostas

  • Bom dia,

    Segue como ficaria a consulta da forma que disse anteriormente:

    with CTE_Max as
    (
     SELECT  N.id, N.NomePiloto as NomePilotol, N.Modelonome as Equipamento, 
     stuff ((SELECT ', ' + T.descTreina from Tbl_NRTespecifico as T where T.id_nrt = N.id order by T.descTreina  for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') as cursos,
     max(  case when NE.descTreina = 'AVSEC' then DATEADD(dd, NE.tempo,N.DatInicial) end) av,
     max(case when NE.descTreina = 'SGSO' then  DATEADD(dd, NE.tempo,N.DatInicial) end )sg, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,Se.Dtfinal) end )vool, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,N.DatFinal) end )solol ,
     max (case when NE.descTreina = 'ART. PERIGOSOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end )art,
     max(case when NE.descTreina = 'CRM' then  DATEADD(dd, NE.tempo,N.DatInicial) end )cmri, 
     max(case when NE.descTreina = 'CARG. EXTERNA' then  DATEADD(dd, NE.tempo,N.DatInicial) end) care,
      max(case when NE.descTreina = 'TRANSP. ENFERMOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end) traenf
       from Tbl_NRT as N left join Tbl_NRTespecifico as NE on NE.id_nrt = N.id  
       left join Tbl_SAE as Se on Se.id_NRT = N.Id where N.Ativo ='A' and N.Decricao = 'examinador' 
     group by N.id, N.NomePiloto, N.Modelonome  order by N.NomePiloto asc
    )
    
    select
     id,
     NomePilotol,
     Equipamento, 
     cursos,
     av,
     sg, 
     coalesce(vool, av) as vool, 
     colaesce(solol, av) as solol,
     art,
     cmri, 
     care,
     traenf
    from CTE_Max

    Só não sei se entendi corretamente o que você quer.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Wsti quinta-feira, 26 de novembro de 2020 16:52
    quinta-feira, 26 de novembro de 2020 14:07

Todas as Respostas

  • Boa noite,

    Não sei se entendi corretamente a sua questão, mas acho que uma alternativa seria você utilizar uma CTE, onde seria executada essa consulta que você postou, e em seguida você consultaria a CTE utilizando o comando Case (ou as funções Coalesce ou IsNull que são específicas para substituir null por outro valor) para avaliar os valores das colunas conforme necessário.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 26 de novembro de 2020 02:42
  • Bom dia Gapimex, obrigado pela resposta. Essas Ctes é que me matam rs. Vivo encalhando nelas.
    quinta-feira, 26 de novembro de 2020 13:00
  • Bom dia,

    Segue como ficaria a consulta da forma que disse anteriormente:

    with CTE_Max as
    (
     SELECT  N.id, N.NomePiloto as NomePilotol, N.Modelonome as Equipamento, 
     stuff ((SELECT ', ' + T.descTreina from Tbl_NRTespecifico as T where T.id_nrt = N.id order by T.descTreina  for xml path(''), TYPE).value('.', 'varchar(max)'), 1, 2, '') as cursos,
     max(  case when NE.descTreina = 'AVSEC' then DATEADD(dd, NE.tempo,N.DatInicial) end) av,
     max(case when NE.descTreina = 'SGSO' then  DATEADD(dd, NE.tempo,N.DatInicial) end )sg, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,Se.Dtfinal) end )vool, 
     max(case when NE.descTreina = 'N/A' then  DATEADD(dd, NE.tempo,N.DatFinal) end )solol ,
     max (case when NE.descTreina = 'ART. PERIGOSOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end )art,
     max(case when NE.descTreina = 'CRM' then  DATEADD(dd, NE.tempo,N.DatInicial) end )cmri, 
     max(case when NE.descTreina = 'CARG. EXTERNA' then  DATEADD(dd, NE.tempo,N.DatInicial) end) care,
      max(case when NE.descTreina = 'TRANSP. ENFERMOS' then  DATEADD(dd, NE.tempo,N.DatInicial) end) traenf
       from Tbl_NRT as N left join Tbl_NRTespecifico as NE on NE.id_nrt = N.id  
       left join Tbl_SAE as Se on Se.id_NRT = N.Id where N.Ativo ='A' and N.Decricao = 'examinador' 
     group by N.id, N.NomePiloto, N.Modelonome  order by N.NomePiloto asc
    )
    
    select
     id,
     NomePilotol,
     Equipamento, 
     cursos,
     av,
     sg, 
     coalesce(vool, av) as vool, 
     colaesce(solol, av) as solol,
     art,
     cmri, 
     care,
     traenf
    from CTE_Max

    Só não sei se entendi corretamente o que você quer.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Wsti quinta-feira, 26 de novembro de 2020 16:52
    quinta-feira, 26 de novembro de 2020 14:07
  • Opa,

    Não sei se entendi, mas pq tu simplesmente não agrupa o case, ex:

    CASE 

             WHEN .... THEN ...

             WHEN .... THEN ...

             ....

             ELSE ....

    END

    quinta-feira, 26 de novembro de 2020 14:37
  • gapimex,

    Obrigado pela resposta.

    Então, funciona assim. posso gravar um ou mais cursos conforme as descrições ( avsec, crm etc) para cada um existe uma validade que ja calculo e gravo nas tabelas. isso esta correto. o que preciso é trazer esta data para relatorios, e painel assim sei quando vence e qual data de renovação. esta consulta esta trazendo resultados pq testei aqui, ok  fiz uma alteração que como havia dito preciso comparar todos os campos vool/ av/sg/art/cmri/care/traenf  mas me resta uma duvida, ele vai trazer nesta ordem o 1 que seja diferente de NULL ? pq a pergunta como as datas de vencimento são diferentes se seguir ordem vou ter que colocar a ordem correta, tipo av tem data de vencimento superior a sg. 

    att, ricardo.

    quinta-feira, 26 de novembro de 2020 14:45
  • Numa pesquisa rapida aqui, ele pega o 1 não null então tenho que colocar na ordem. so pra confirmar. 
    quinta-feira, 26 de novembro de 2020 15:00