2 queries e uma conta final em um único SQL

(Última atualização em: 22 de fevereiro de 2016)

Quantos usuários do Alura já compraram livros na Casa do Código e quantos não?
Fácil, executa duas queries, cria uma stored procedure (aiiiiiii meu coração), devolve um divido pelo outro:

select count(comprouNaCDC) as compraram from Aluno where comprouNaCDC = 1;
> 200
select count(comprouNaCDC) as nao_compraram from Aluno where comprouNaCDC = 0;
> 300

E uma stored equivalente a:

porcentagem = compraram / (compraram + nao_compraram)
> 0.40

Como diz minha sobrinha de 2 anos:
-Uxi!
E sai correndo, fugindo de medo.

Poderia agrupar, e fazer a divisão:

select count(comprouNaCDC), comprouNaCDC from Aluno group by comprouNaCDC;
> 200, 1
> 300, 0

E usar a mesma fórmula em procedure ou programação: uxi.

Podemos só contar o total 🙂

select count(*) as total from Alunos;
> 500

Se o seu banco usa 0 ou 1 para marcar quem comprou, soma todo mundo:

select sum(comprouNaCDC) as compraram from Alunos;
> 200

Calma lá, é só dividir quem comprou pelo total. Uma unica query:

select sum(comprouNaCDC) / count(*) as  porcentagem from Alunos;
> 0.40

Tá lá, sem subquery, sem procedure, sem temporary table, doidice.

Desafio: e se o campo não fosse 0 e 1? Como você transformaria uma string ‘S’ e ‘N’ para a query acima funcionar? *CASO* você tenha uma sugestão, compartilhe!

Gostou do post? Quer aprender mais? Que tal dar uma olhada em nossa trilha de Banco de Dados?

ps: Essa boa prática é a primeira parte de uma super prática animal sugerida pelo aluno do Alura, Silvio Silva!

Tech Education Leader no Alura

  • Desafio:

    select sum(case comprouNaCDC when ‘S’ then 1 else 0 end) / count(*) as porcentagem from Alunos;

    Seria isso?

    • Ótimo Bruno! Repara o * no *caso* que eu citei 🙂 E o *case* na sua solução, coincidência?

      Abraço!

      • É muita coincidência!

        Obrigado!

  • Felipe

    Desafio:
    select (select count(*) from Alunos where comprouNaCDC = ‘S’) / count(*) as procentagem from Alunos;

    O resultado obtido utilizando uma SubQuery também é válido?

Próximo ArtigoCores com harmonia