Tenho a seguinte tabela:
NAME
Alex
Bob
Bob
Tim
Alex
Roger
Preciso produzir o seguinte:
Name Count Percentage
Alex 2 33%
Bob 2 33%
Roger 1 16.6%
Tim 1 16.6%
Eu não tenho ideia por onde começar. Eu posso fazer a consulta inicial para a contagem que é simples.
Possível com um único
SELECT
:count(*)
é uma forma separada da função e um pouco mais rápida quecount(<expression>)
. Supondo que todas as colunas sejamNOT NULL
, caso contrário, você pode ter que usar o último.Você pode executar a função de agregação da janela
sum(count(*)) OVER ()
para obter o total no mesmo arquivoSELECT
. Considere a sequência de eventos em umSELECT
:Isso usa uma varredura sequencial em vez de duas e normalmente é duas vezes mais rápido do que usar uma subconsulta para a contagem total.
to_char()
embeleza a saída:Esta é uma boa oportunidade para usar as funções da janela :
Isso resulta em uma saída como a seguinte:
Você pode ajustar o código de arredondamento se quiser um formato ligeiramente diferente. Você também pode concatenar
%
a aopct
valor da coluna, mas precisaria convertê-lotext
primeiro e a coluna resultante seriatext
oposta anumeric
(o que pode ser bom para o seu caso).Uma grande vantagem que esse estilo de consulta tem é que, se sua tabela ficar mais complexa e tiver mais colunas, você ainda poderá lidar com esses dados, retorná-los em consultas mesmo e ainda ter acesso aos dados de contagem e porcentagem devido ao como o escopo da função de janela funciona. Se você remover o distinto, também poderá obtê-lo por linha, mesmo para o mesmo nome.
SQL Fiddle
VIOLINO
Eu sinto que possivelmente estou trapaceando um pouco, mas isso deve obter seu resultado:
Uma maneira é usar uma subconsulta:
Exemplo de violino SQL