Eu tenho uma tabela do SQL Server que contém usuários e suas notas. Por uma questão de simplicidade, vamos apenas dizer que existem 2 colunas - name
& grade
. Portanto, uma linha típica seria Nome: "John Doe", Nota: "A".
Estou procurando uma instrução SQL que encontre as porcentagens de todas as respostas possíveis. (A, B, C, etc ...) Além disso, existe uma maneira de fazer isso sem definir todas as respostas possíveis (campo de texto aberto - os usuários podem inserir 'passa / falha', 'nenhum', etc ...)
O resultado final que procuro é A: 5%, B: 15%, C: 40%, etc ...
sql
sql-server
tsql
Alex
fonte
fonte
O mais eficiente (usando over ()).
Universal (qualquer versão do SQL).
Com o CTE, o menos eficiente.
fonte
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
trabalhos excelentes no Postgresql 10Em vez de usar um CTE separado para obter o total, você pode usar uma função de janela sem a cláusula "partição por".
Se você estiver usando:
para obter a contagem de um grupo, você pode usar:
para obter a contagem total.
Por exemplo:
Tende a ser mais rápido em minha experiência, mas acho que ela pode usar internamente uma tabela temporária em alguns casos (vi o "Worktable" ao executar com "definir estatísticas io on").
Edição: Não tenho certeza se o meu exemplo de consulta é o que você está procurando, eu estava apenas ilustrando como as funções de janelas funcionam.
fonte
tempdb
qual está a mesa de trabalho. A lógica lê parecer maior , mas eles são contados de forma diferente do que o normalCOUNT(*) OVER ()
na sua consulta retornaria uma figura completamente não relacionada (especificamente, o número de linhas do conjunto de resultados agrupado ). Você deve usar em seuSUM(COUNT(*)) OVER ()
lugar.Você precisa calcular o total de notas Se for o SQL 2005, você pode usar o CTE
fonte
Você precisa agrupar no campo de notas. Essa consulta deve fornecer o que você procura em praticamente qualquer banco de dados.
Você deve especificar o sistema que está usando.
fonte
Eu simplesmente uso isso sempre que preciso calcular uma porcentagem.
Observe que 100.0 retorna decimais, enquanto 100 por si só arredondará o resultado para o número inteiro mais próximo, mesmo com a função ROUND ()!
fonte
O seguinte deve funcionar
EDIT: Moveu o
* 100
e adicionou o1.0
para garantir que ele não faça divisão inteirafonte
Esta é, acredito, uma solução geral, embora a tenha testado usando o IBM Informix Dynamic Server 11.50.FC3. A seguinte consulta:
fornece a seguinte saída nos dados de teste mostrados abaixo da regra horizontal. A
ROUND
função pode ser específica ao DBMS, mas o resto (provavelmente) não é. (Observe que alterei 100 para 100,0 para garantir que o cálculo ocorra usando aritmético não inteiro - DECIMAL, NUMÉRICO -; veja os comentários e obrigado ao Thunder.)fonte
fonte
Em qualquer versão do servidor sql, você pode usar uma variável para o total de todas as notas como esta:
fonte
Você pode usar uma subseleção na consulta from (não testada e não tem certeza do que é mais rápido):
Ou
Ou
Você também pode usar um procedimento armazenado (desculpas pela sintaxe do Firebird):
fonte
Eu tive um problema semelhante a isso. você poderá obter o resultado correto multiplicando por 1,0 em vez de 100. Veja o exemplo Imagem anexada
Selecionar nota, (Contagem (nota) * 1,0 / (Selecionar contagem (*) de MyTable)) como Pontuação do MyTable Agrupar por nota
fonte
Este está funcionando bem no MS SQL. Transforma varchar no resultado de flutuação limitada de duas casas decimais.
fonte