none
Erro ao usar HAVING em consulta RRS feed

  • Pergunta

  • Tenho a seguinte consulta:

     SELECT 
        ROW_NUMBER() OVER(ORDER BY V.DATA ASC) AS ID,
        V.CHAPA AS CHAPA,
        F.NOME  AS NOME,
        V.DATA  AS DATA,
        CASE WHEN V.BATIDA IS NULL THEN 0 ELSE V.BATIDA END AS IS_NULL
            FROM
                ARELBATIDATRANSITOVIEW AS V
                LEFT JOIN V_DADOSFUNC  AS F ON V.CHAPA = F.CHAPA
          WHERE
              V.CHAPA = 2311 
                GROUP BY V.CHAPA,V.DATA,F.NOME,V.BATIDA
                    HAVING IS_NULL = '1900-01-01 00:00:00.000'
                  ORDER BY DATA ASC

    Esta retornando a seguinte mensagem:

    Mensagem 207, Nível 16, Estado 1, Linha 42 Invalid column name 'IS_NULL'.

    quinta-feira, 20 de outubro de 2016 18:45

Respostas

  •  @Wesley,

    Mas porque usar um Group e Having, se nao ha nenhuma funçao de agregaçao? Mas concordo com voce : o tipo datetime é relevante, mas se o tipo nulo é igual a data minima, entao seria mais facil verificar o proprio nulo sem nenhuma conversao?

    SELECT  ROW_NUMBER() OVER ( ORDER BY V.DATA ASC ) AS ID ,
            V.CHAPA AS CHAPA ,
            F.Nome AS NOME ,
            V.DATA AS DATA ,
    ISNULL(CAST(V.BATIDA AS DATE), CAST('1900-01-01 00:00:00.000' AS DATE) as BATIDA
    
    FROM    dbo.ARELBATIDATRANSITOVIEW AS V
            LEFT JOIN dbo.V_DADOSFUNC AS F ON V.CHAPA = F.CHAPA
    WHERE   V.CHAPA = 2311 and V.BATIDA is null
    ORDER BY DATA ASC;

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------




    quinta-feira, 20 de outubro de 2016 19:34

Todas as Respostas

  • Olá,

    A mensagem informa que não existe uma coluna chamada IS_NULL que está sendo usada na cláusula HAVING, verifique isso!

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 20 de outubro de 2016 18:50
  • Mais ela existe:

       CASE WHEN V.BATIDA IS NULL THEN 0 ELSE V.BATIDA END AS IS_NULL

    quinta-feira, 20 de outubro de 2016 19:00
  • O problema esta na ordem de processamento do Sql Sever

    a ordem de escrita e diferente do processamento 

    ordem de escrita

    1)Select [ campo]
    2) From [tabela]
    3)Where [condição]
    4)Group by [campos listados no select]
    5)Having [condição do grupo]
    6)Order by [ordem em que o resultado deve aparecer]


    Ordem de Processamento 

    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. SELECT
    6. ORDER BY




    Logo seu Alias 'Is_Null' so vai ser visto pelo Order by

    Para corrigir isso faça assim

    SELECT  ROW_NUMBER() OVER ( ORDER BY V.DATA ASC ) AS ID ,
            V.CHAPA AS CHAPA ,
            F.NOME AS NOME ,
            V.DATA AS DATA ,
            CASE WHEN V.BATIDA IS NULL THEN 0
                 ELSE V.BATIDA
            END AS IS_NULL
    FROM    ARELBATIDATRANSITOVIEW AS V
            LEFT JOIN V_DADOSFUNC AS F ON V.CHAPA = F.CHAPA
    WHERE   V.CHAPA = 2311
    GROUP BY V.CHAPA ,
            V.DATA ,
            F.NOME ,
            V.BATIDA
    HAVING  (CASE WHEN V.BATIDA IS NULL THEN 0
                 ELSE V.BATIDA) = '1900-01-01 00:00:00.000'
    ORDER BY DATA ASC;


    Wesley Neves



    • Editado Wesley Neves quinta-feira, 20 de outubro de 2016 19:12 melhora
    quinta-feira, 20 de outubro de 2016 19:07
  • Ele retornou : 

    Mensagem 102, Nível 15, Estado 1, Linha 40
    Incorrect syntax near ')'.

    Nesse campo:

    HAVING  (CASE WHEN V.BATIDA IS NULL THEN 0
                 ELSE V.BATIDA) = '1900-01-01 00:00:00.000'

    quinta-feira, 20 de outubro de 2016 19:13
  • Por que usar case?

    IsNull é uma funçao nativa:

     SELECT 
        ROW_NUMBER() OVER(ORDER BY V.DATA ASC) AS ID,
        V.CHAPA AS CHAPA,
        F.NOME  AS NOME,
        V.DATA  AS DATA,
        isnull(V.BATIDA, 0 ) as BATIDA
    FROM
     ARELBATIDATRANSITOVIEW AS V
     LEFT JOIN V_DADOSFUNC  AS F ON V.CHAPA = F.CHAPA
    WHERE .CHAPA = 2311 and     isnnull(V.BATIDA, 0 )='1900-01-01 00:00:00.000'
    ORDER BY DATA ASC


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 20 de outubro de 2016 19:15
  • Temos um detalhe

    HAVING IS_NULL = '1900-01-01 00:00:00.000'

     CASE WHEN V.BATIDA IS NULL THEN 0
                 ELSE V.BATIDA

    qual e o tipo de dados de

    V.BATIDA

    vc esta setando 0 para o campo ,e abaixo quer comparar com o tipo de dados Datetime

    isso esta certo ?


    Wesley Neves

    quinta-feira, 20 de outubro de 2016 19:23
  • Se o Campo V.Batida for Tipo DateTime , tente isso


    DECLARE @MinDate DATETIME  = DATEFROMPARTS(1990, 1, 1)
    
    SELECT  ROW_NUMBER() OVER ( ORDER BY V.DATA ASC ) AS ID ,
            V.CHAPA AS CHAPA ,
            F.Nome AS NOME ,
            V.DATA AS DATA ,
            CASE WHEN V.BATIDA IS NULL THEN 0
                 ELSE V.BATIDA
            END AS IS_NULL
    FROM    dbo.ARELBATIDATRANSITOVIEW AS V
            LEFT JOIN dbo.V_DADOSFUNC AS F ON V.CHAPA = F.CHAPA
    WHERE   V.CHAPA = 2311
    GROUP BY V.CHAPA ,
            V.DATA ,
            F.Nome ,
            V.BATIDA
    HAVING  ISNULL(CAST(V.BATIDA AS DATE), @MinDate) = CAST('1900-01-01 00:00:00.000' AS DATE)
    ORDER BY DATA ASC;


    Wesley Neves


    • Editado Wesley Neves quinta-feira, 20 de outubro de 2016 19:27 melhora
    quinta-feira, 20 de outubro de 2016 19:26
  •  @Wesley,

    Mas porque usar um Group e Having, se nao ha nenhuma funçao de agregaçao? Mas concordo com voce : o tipo datetime é relevante, mas se o tipo nulo é igual a data minima, entao seria mais facil verificar o proprio nulo sem nenhuma conversao?

    SELECT  ROW_NUMBER() OVER ( ORDER BY V.DATA ASC ) AS ID ,
            V.CHAPA AS CHAPA ,
            F.Nome AS NOME ,
            V.DATA AS DATA ,
    ISNULL(CAST(V.BATIDA AS DATE), CAST('1900-01-01 00:00:00.000' AS DATE) as BATIDA
    
    FROM    dbo.ARELBATIDATRANSITOVIEW AS V
            LEFT JOIN dbo.V_DADOSFUNC AS F ON V.CHAPA = F.CHAPA
    WHERE   V.CHAPA = 2311 and V.BATIDA is null
    ORDER BY DATA ASC;

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------




    quinta-feira, 20 de outubro de 2016 19:34
  • Perfeito, Obrigado.

     Segue Final:

      SELECT 
        ROW_NUMBER() OVER(ORDER BY V.DATA ASC) AS ID,
        V.CHAPA AS CHAPA,
        F.NOME  AS NOME,
        V.DATA  AS DATA,
        isnull(V.BATIDA, 0 ) as TBATIDA
    FROM
     ARELBATIDATRANSITOVIEW AS V
     LEFT JOIN V_DADOSFUNC  AS F ON V.CHAPA = F.CHAPA
    WHERE V.CHAPA = 2311  
    AND isnull(V.BATIDA, 0 )='1900-01-01 00:00:00.000'
      ORDER BY DATA ASC
    quinta-feira, 20 de outubro de 2016 20:37