none
[Where] Como faço um where sobre o valor de uma subtração? RRS feed

  • Pergunta

  • Olá,
    Tenho o seguinte select:

    select A, B, A - B as C
    From Alfabeto

    O que preciso fazer é trazer apenas os resultados onde C é > 0.

    Como poderia fazer isto?
    Fazer um where sobre o valor da conta?

    Obrigado amigos


    K2rto'4 - Analista de Sistemas
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善


    • Editado TI DEV sexta-feira, 27 de março de 2015 14:22
    sexta-feira, 27 de março de 2015 14:22

Respostas

  • Olá,

    Tudo bem?

    No meu caso aqui talvez seja mais complicado. Segue select real:

    select
        Nome,
        count(A) as A,
        count(B) as B,
        count(A) - count(B) as C
    from CTE_Union
    
    group by Nome
    order by 4 desc

    Já tentei os casos abaixo, mas nada deu certo:

    count(A) - count(B) > 0

    (count(A) - count(B)) > 0

    O erro que levo é:

    An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

    E agora?

    Obrigado


    K2rto'4 - Analista de Sistemas
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    Amigo,

    A mensagem é clara, use a cláusula HAVING. Segue abaixo uma sugestão para você adaptar ao seu script:

    select
        Nome,
        count(A) as A,
        count(B) as B,
        count(A) - count(B) as C
    from CTE_Union
    group by Nome
    
    HAVING (count(A) - count(B)) > 0
    GO

     Para maiores informações veja:

    https://technet.microsoft.com/pt-br/library/ms173260%28v=sql.110%29.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Sugerido como Resposta _Juliano_Alves_ sexta-feira, 27 de março de 2015 16:45
    • Marcado como Resposta TI DEV sexta-feira, 27 de março de 2015 17:04
    sexta-feira, 27 de março de 2015 16:01
    Moderador

Todas as Respostas

  • K2RTO'4,

    Segue um script para você adaptar a sua necessidade:

    DECLARE @TB_TESTE AS TABLE (
    A INT,
    B INT);
    
    INSERT INTO @TB_TESTE VALUES (4, 1)
    INSERT INTO @TB_TESTE VALUES (5, 1)
    INSERT INTO @TB_TESTE VALUES (6, 6)
    
    SELECT * FROM @TB_TESTE
    
    SELECT A, B, (A-B) AS C FROM @TB_TESTE WHERE (A-B) > 0;
    GO
    

    Segue um print como evidência de teste:


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sexta-feira, 27 de março de 2015 14:30
    Moderador
  • Bom dia,

    Seguem 2 sugestões para teste de qual funciona melhor para o seu caso:

    select A, B, A - B as C
    From Alfabeto
    where A - B > 0

    with CTE_Sub as
    (
        select A, B, A - B as C
        From Alfabeto
    )
    
    select * 
    from CTE_Sub
    where C > 0

    Espero que ajude.


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

    sexta-feira, 27 de março de 2015 14:33
  • Olá,

    Tudo bem?

    No meu caso aqui talvez seja mais complicado. Segue select real:

    select
        Nome,
        count(A) as A,
        count(B) as B,
        count(A) - count(B) as C
    from CTE_Union
    
    group by Nome
    order by 4 desc

    Já tentei os casos abaixo, mas nada deu certo:

    count(A) - count(B) > 0

    (count(A) - count(B)) > 0

    O erro que levo é:

    An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

    E agora?

    Obrigado


    K2rto'4 - Analista de Sistemas
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    • Editado TI DEV sexta-feira, 27 de março de 2015 15:09
    sexta-feira, 27 de março de 2015 15:06
  • Deste jeito:

    Select A,B, A-B as C
    from ( select
        Nome,
        count(A) as A,
        count(B) as B,
    from CTE_Union
    group by Nome
    ) t1
    where A-B >0

    att


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


    sexta-feira, 27 de março de 2015 15:13
  • Olá,

    Tudo bem?

    No meu caso aqui talvez seja mais complicado. Segue select real:

    select
        Nome,
        count(A) as A,
        count(B) as B,
        count(A) - count(B) as C
    from CTE_Union
    
    group by Nome
    order by 4 desc

    Já tentei os casos abaixo, mas nada deu certo:

    count(A) - count(B) > 0

    (count(A) - count(B)) > 0

    O erro que levo é:

    An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

    E agora?

    Obrigado


    K2rto'4 - Analista de Sistemas
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善



    Amigo,

    A mensagem é clara, use a cláusula HAVING. Segue abaixo uma sugestão para você adaptar ao seu script:

    select
        Nome,
        count(A) as A,
        count(B) as B,
        count(A) - count(B) as C
    from CTE_Union
    group by Nome
    
    HAVING (count(A) - count(B)) > 0
    GO

     Para maiores informações veja:

    https://technet.microsoft.com/pt-br/library/ms173260%28v=sql.110%29.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Sugerido como Resposta _Juliano_Alves_ sexta-feira, 27 de março de 2015 16:45
    • Marcado como Resposta TI DEV sexta-feira, 27 de março de 2015 17:04
    sexta-feira, 27 de março de 2015 16:01
    Moderador
  • Obrigado a todos.

    Durval, consegui fazer aqui com o having :)

    Abraços


    K2rto'4 - Analista de Sistemas
    "Hoje melhor do que ontem, amanhã melhor do que hoje!" 改 善

    sexta-feira, 27 de março de 2015 17:09