none
Retirar Valores NULOS e Agrupando-os em uma linha RRS feed

  • Pergunta

  • Boa tarde pessoal do grupo, estava fazendo uma consulta de pessoas que não conseguirão atingir nota nos ciclos da instituição e mesmo eu aplicando distinct nos campos, mesmo assim esta me trazendo valores duplicados e NULLS, tentei aplicar is null e mesmo assim sem exito.

    select distinct
     SMATRICULA.NUMDIARIO, 
     SALUNO.RA,
     PPESSOA.nome,
     SNOTAETAPA.TIPOETAPA,
     SNOTAETAPA.IDTURMADISC,
     --coalesce(SNOTAETAPA.NOTAFALTA, ),
    
    
    CASE WHEN SNOTAETAPA.TIPOETAPA = 'N' AND SNOTAETAPA.CODETAPA = '1' THEN
     
     Case When SNOTAETAPA.NOTAFALTA is not null and SNOTAETAPA.NOTAFALTA< (30*60/100) then
             '*'+cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         Else
             cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         End  
    
    END AS NOTACICLO1,
    
    CASE WHEN SNOTAETAPA.TIPOETAPA = 'N' AND SNOTAETAPA.CODETAPA = '2' THEN
     
     Case When SNOTAETAPA.NOTAFALTA is not null and SNOTAETAPA.NOTAFALTA< (30*60/100) then
             '*'+cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         Else
             cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         End  
    
    END AS NOTACICLO2,
    
    
    CASE WHEN SNOTAETAPA.TIPOETAPA = 'N' AND SNOTAETAPA.CODETAPA = '3' THEN
     
     Case When SNOTAETAPA.NOTAFALTA is not null and SNOTAETAPA.NOTAFALTA< (40*60/100) then
             '*'+cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         Else
             cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         End  
    
    END AS NOTACICLO3,
    
    
    CASE WHEN SNOTAETAPA.TIPOETAPA = 'N' AND SNOTAETAPA.CODETAPA = '4' THEN
     
     Case When SNOTAETAPA.NOTAFALTA< (100*60/100) then
             '*'+cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         Else
             cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         End  
    
    END AS EXFINAL,
    
    
    CASE WHEN SNOTAETAPA.TIPOETAPA = 'N' AND SNOTAETAPA.CODETAPA = '0' THEN
     
     Case When SNOTAETAPA.NOTAFALTA< (100*60/100) then
             '*'+cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         Else
             cast(SNOTAETAPA.NOTAFALTA as varchar(100))
         End  
    
    END AS RESFINAL,
    
    CASE WHEN ISNULL (SNOTAETAPA.NOTAFALTA,0) >=0 THEN
          SSTATUS.DESCRICAO
          
          ELSE
          NULL
          END
    
     
     --    umatalun.f0,
    
     --case when isnull (umatalun.a0,0) >= 0 then 
     --       usitmat.descricao
     --         else
     --    null
     --       end 
    --select * from SNOTAETAPA where RA='12-1-05806'
    --select * from UMATALUN where MATALUNO=''
     
    from 
     SMATRICULA,
     SALUNO,
     PPESSOA,
     SNOTAETAPA,
     SSTATUS
       
     where
     SMATRICULA.RA = SALUNO.RA
     AND SMATRICULA.IDTURMADISC = SNOTAETAPA.IDTURMADISC
     AND SMATRICULA.RA = SNOTAETAPA.RA
     AND SMATRICULA.CODSTATUS = SSTATUS.CODSTATUS
     AND SALUNO.CODPESSOA = PPESSOA.CODIGO
      
        AND    SALUNO.RA ='12-1-05806'
        and SNOTAETAPA.TIPOETAPA='n' 
        and SNOTAETAPA.IDTURMADISC='3861'
        
        group by SMATRICULA.NUMDIARIO, 
     SALUNO.RA,
     PPESSOA.nome,
     SNOTAETAPA.TIPOETAPA,
     SNOTAETAPA.IDTURMADISC,SNOTAETAPA.TIPOETAPA,SNOTAETAPA.NOTAFALTA, SNOTAETAPA.CODETAPA, SSTATUS.DESCRICAO

    Como faço para deixar estes valores em uma linha só?


    CharlesTI.


    • Editado CHARLES.PTU quinta-feira, 3 de março de 2016 17:50
    quinta-feira, 3 de março de 2016 17:45

Respostas

  • Experimente fazer um teste com essa versão sem Pivot:

    select
        SMATRICULA.NUMDIARIO, 
        SALUNO.RA,
        PPESSOA.nome,
        SNOTAETAPA.TIPOETAPA,
        SNOTAETAPA.IDTURMADISC,
        max(case when SNOTAETAPA.CODETAPA = '1'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (30*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO1,
        max(case when SNOTAETAPA.CODETAPA = '2'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (30*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO2,
        max(case when SNOTAETAPA.CODETAPA = '3'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (40*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO3,
        max(case when SNOTAETAPA.CODETAPA = '4'
                then 
                    case when SNOTAETAPA.NOTAFALTA < 60 then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as EXFINAL,
        max(case when SNOTAETAPA.CODETAPA = '0'
                then 
                    case when SNOTAETAPA.NOTAFALTA < *60 then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as RESFINAL,
        SSTATUS.DESCRICAO
    from SMATRICULA
    inner join SALUNO 
        on 
            SALUNO.RA = SMATRICULA.RA
    inner join PPESSOA
        on
            PPESSOA.CODIGO = SALUNO.CODPESSOA
    inner join SSTATUS
        on
            SSTATUS.CODSTATUS = SMATRICULA.CODSTATUS
    inner join SNOTAETAPA
        on
            SNOTAETAPA.IDTURMADISC = SMATRICULA.IDTURMADISC AND
            SNOTAETAPA.RA = SMATRICULA.RA
    where
        SALUNO.RA = '12-1-05806' and 
        SNOTAETAPA.TIPOETAPA = 'N' and 
        SNOTAETAPA.IDTURMADISC = '3861'
    group by
        SMATRICULA.NUMDIARIO, 
        SALUNO.RA,
        PPESSOA.nome,
        SNOTAETAPA.TIPOETAPA,
        SNOTAETAPA.IDTURMADISC,
        SSTATUS.DESCRICAO

    Espero que ajude


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

    quinta-feira, 3 de março de 2016 20:20

Todas as Respostas

  • Boa tarde,

    Não sei se entendi corretamente a sua query, mas desconfio que no seu caso seja melhor utilizar Pivot.

    Experimente fazer um teste com a query abaixo para ver se é obtido o resultado esperado:

    select
        NUMDIARIO, 
        RA,
        nome,
        TIPOETAPA,
        IDTURMADISC,
        case when [1] < (30*60/100) then '*' else '' end + cast([1] as varchar(100)) as NOTACICLO1,
        case when [2] < (30*60/100) then '*' else '' end + cast([2] as varchar(100)) as NOTACICLO2,
        case when [3] < (40*60/100) then '*' else '' end + cast([1] as varchar(100)) as NOTACICLO3,
        case when [4] < 60 then '*' else '' end + cast([1] as varchar(100)) as EXFINAL,
        case when [0] < 60 then '*' else '' end + cast([1] as varchar(100)) as RESFINAL,
        DESCRICAO
    from
    (
        select
            SMATRICULA.NUMDIARIO, 
            SALUNO.RA,
            PPESSOA.nome,
            SNOTAETAPA.TIPOETAPA,
            SNOTAETAPA.IDTURMADISC,
            SNOTAETAPA.CODETAPA,
            SNOTAETAPA.NOTAFALTA
            SSTATUS.DESCRICAO
        from SMATRICULA
        inner join SALUNO 
            on 
                SALUNO.RA = SMATRICULA.RA
        inner join PPESSOA
            on
                PPESSOA.CODIGO = SALUNO.CODPESSOA
        inner join SSTATUS
            on
                SSTATUS.CODSTATUS = SMATRICULA.CODSTATUS
        inner join SNOTAETAPA
            on
                SNOTAETAPA.IDTURMADISC = SMATRICULA.IDTURMADISC AND
                SNOTAETAPA.RA = SMATRICULA.RA
        where
            SALUNO.RA = '12-1-05806' and 
            SNOTAETAPA.TIPOETAPA = 'N' and 
            SNOTAETAPA.IDTURMADISC = '3861'
    ) as t 
    pivot
    (
        max(SNOTAETAPA.NOTAFALTA) for SNOTAETAPA.CODETAPA in ([1], [2], [3], [4], 0])
    ) as p   

    Espero que ajude


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

    quinta-feira, 3 de março de 2016 19:51
  • Boa tarde Gapimex,

    quando fui executar a consulta deu o seguinte erro:

    Msg 325, Level 15, State 1, Line 43
    Incorrect syntax near 'pivot'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE.



    CharlesTI.

    quinta-feira, 3 de março de 2016 20:00
  • Experimente fazer um teste com essa versão sem Pivot:

    select
        SMATRICULA.NUMDIARIO, 
        SALUNO.RA,
        PPESSOA.nome,
        SNOTAETAPA.TIPOETAPA,
        SNOTAETAPA.IDTURMADISC,
        max(case when SNOTAETAPA.CODETAPA = '1'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (30*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO1,
        max(case when SNOTAETAPA.CODETAPA = '2'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (30*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO2,
        max(case when SNOTAETAPA.CODETAPA = '3'
                then 
                    case when SNOTAETAPA.NOTAFALTA < (40*60/100) then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as NOTACICLO3,
        max(case when SNOTAETAPA.CODETAPA = '4'
                then 
                    case when SNOTAETAPA.NOTAFALTA < 60 then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as EXFINAL,
        max(case when SNOTAETAPA.CODETAPA = '0'
                then 
                    case when SNOTAETAPA.NOTAFALTA < *60 then '*' else '' end + 
                    cast(SNOTAETAPA.NOTAFALTA as varchar(100))
            end) as RESFINAL,
        SSTATUS.DESCRICAO
    from SMATRICULA
    inner join SALUNO 
        on 
            SALUNO.RA = SMATRICULA.RA
    inner join PPESSOA
        on
            PPESSOA.CODIGO = SALUNO.CODPESSOA
    inner join SSTATUS
        on
            SSTATUS.CODSTATUS = SMATRICULA.CODSTATUS
    inner join SNOTAETAPA
        on
            SNOTAETAPA.IDTURMADISC = SMATRICULA.IDTURMADISC AND
            SNOTAETAPA.RA = SMATRICULA.RA
    where
        SALUNO.RA = '12-1-05806' and 
        SNOTAETAPA.TIPOETAPA = 'N' and 
        SNOTAETAPA.IDTURMADISC = '3861'
    group by
        SMATRICULA.NUMDIARIO, 
        SALUNO.RA,
        PPESSOA.nome,
        SNOTAETAPA.TIPOETAPA,
        SNOTAETAPA.IDTURMADISC,
        SSTATUS.DESCRICAO

    Espero que ajude


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

    quinta-feira, 3 de março de 2016 20:20
  • Gapimex,

    desculpe a demora, muitissimo obrigado por me ajudar a resolver este problema, esta ultima consulta tua resolveu certinho meus problemas.

    CharlesTI.


    • Editado CHARLES.PTU sexta-feira, 4 de março de 2016 13:08
    sexta-feira, 4 de março de 2016 10:47