Tengo una tabla de SQL Server que contiene usuarios y sus calificaciones. Por simplicidad, digamos que hay 2 columnas - name
& grade
. Entonces, una fila típica sería Nombre: "John Doe", Grado: "A".
Estoy buscando una declaración SQL que encuentre los porcentajes de todas las respuestas posibles. (A, B, C, etc.) Además, ¿hay alguna manera de hacerlo sin definir todas las respuestas posibles (campo de texto abierto: los usuarios pueden ingresar 'pasar / fallar', 'ninguno', etc.)
El resultado final que estoy buscando es A: 5%, B: 15%, C: 40%, etc.
sql
sql-server
tsql
Alex
fuente
fuente
El más eficiente (usando over ()).
Universal (cualquier versión de SQL).
Con CTE, el menos eficiente.
fuente
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
trabajos excelentes en Postgresql 10En lugar de usar un CTE separado para obtener el total, puede usar una función de ventana sin la cláusula "partición por".
Si estás usando:
Para obtener el recuento de un grupo, puede usar:
para obtener el recuento total.
Por ejemplo:
En mi experiencia, tiende a ser más rápido, pero creo que internamente podría usar una tabla temporal en algunos casos (he visto "Worktable" cuando se ejecuta con "set stats io on").
EDITAR: No estoy seguro de si mi consulta de ejemplo es lo que está buscando, solo estaba ilustrando cómo funcionan las funciones de ventanas.
fuente
tempdb
que se encuentra la mesa de trabajo. Las lecturas lógicas parecen más altas, pero se cuentan de manera diferente a lo normalCOUNT(*) OVER ()
en su consulta devolvería una figura completamente no relacionada (específicamente, el número de filas del conjunto de resultados agrupados ). Deberías usarSUM(COUNT(*)) OVER ()
en su lugar.Debe calcular el total de calificaciones. Si se trata de SQL 2005, puede usar CTE
fuente
Necesitas agruparte en el campo de calificación. Esta consulta debería darle lo que está buscando en prácticamente cualquier base de datos.
Debe especificar el sistema que está utilizando.
fuente
Simplemente uso esto cuando necesito calcular un porcentaje ...
Tenga en cuenta que 100.0 devuelve decimales, mientras que 100 por sí solo redondeará el resultado al número entero más cercano, ¡incluso con la función ROUND ()!
fuente
Lo siguiente debería funcionar
EDITAR: movió
* 100
y agregó el1.0
para asegurarse de que no haga división enterafuente
Esta es, creo, una solución general, aunque la probé utilizando IBM Informix Dynamic Server 11.50.FC3. La siguiente consulta:
da el siguiente resultado en los datos de prueba que se muestran debajo de la regla horizontal. La
ROUND
función puede ser específica de DBMS, pero el resto (probablemente) no lo es. (Tenga en cuenta que cambié de 100 a 100.0 para garantizar que el cálculo se realice usando aritmética no entera - DECIMAL, NUMERIC -; vea los comentarios y gracias a Thunder).fuente
fuente
En cualquier versión de servidor sql, puede usar una variable para el total de todos los grados como este:
fuente
Puede usar una subselección en su consulta from (no probado y no está seguro de cuál es más rápido):
O
O
También puede usar un procedimiento almacenado (disculpas por la sintaxis de Firebird):
fuente
Tuve un problema similar a esto. debería poder obtener el resultado correcto multiplicando por 1.0 en lugar de 100. Vea la imagen adjunta de ejemplo
Seleccione Grado, (Recuento (Grado) * 1.0 / (Seleccione Recuento (*) De MyTable)) como Puntuación del Grupo MyTable Por Grado
fuente
Este está funcionando bien en MS SQL. Transforma varchar al resultado de flotante con dos decimales limitados.
fuente