es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo seleccionar el promedio de los resultados de una fila en Oracle?

Estoy tratando de calcular el promedio de los resultados y luego unirlos.

Mi consulta principal es la siguiente:

SELECT
A.USERNAME,
A.TOTAL,
A.MATH
FROM
(SELECT
B.USERNAME,
COUNT(CLASS_ID) TOTAL,
SUM(CASE WHEN ROOM_ID = ‘1001’ THEN 1 ELSE 0 END) AS MATH
FROM A LESSON, STUDENT B
WHERE
A.USERNAME = B.USERNAME
AND A.CREATED_DATE >= TO_DATE(:created_date ,’YYYYMMDDHH24MISS’)
AND A.CREATED_DATE < TO_DATE(:created_end_date ,’YYYYMMDDHH24MISS’)
GROUP BY B.USERNAME
ORDER BY TOTAL DESC) A

Esto me da:

|USERNAME|TOTAL|MATH|
|John | 480|159 |
|Dave | 360|120 |
|Sarah | 540|130 |
|James | 361|185 |
|Kim | 640|92 |
|Matt | 11 |2 |
|Jane | 8 |1 |

Pero quiero obtener algo como esto:

|USERNAME|TOTAL|AVG_FROM_TOTAL|MATH|AVG_FROM_MATH|
|John | 480| 476 | 159| 137 |
|Dave | 360| 476 | 120| 137 |
|Sarah | 540| 476 | 130| 137 |
|James | 361| 476 | 185| 137 |
|Kim | 640| 476 | 92| 137 |

Se calcula manualmente de la siguiente manera:

  • (480 + 360 + 540 + 361 + 640 / 5 = 476) / se eliminará el usuario Matt y Jane porque es demasiado baja en comparación con otros /
  • (159 + 120 + 130 + 185 + 92 / 5 = 137) / se elimina el resultado de Matt y Jane /

¿Cómo puedo crear la consulta que quiero calcular? ¿Es posible calcular el promedio de los resultados?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible calcular el promedio a partir del resultado utilizando subconsultas.

    Puede modificar su consulta principal para incluir subconsultas para calcular los promedios de las columnas de total y matemáticas, como esta:

    SELECT 
      A.USERNAME,
      A.TOTAL,
      (SELECT AVG(TOTAL) FROM 
        (SELECT B.USERNAME, COUNT(CLASS_ID) TOTAL 
         FROM A LESSON, STUDENT B
         WHERE A.USERNAME = B.USERNAME                    
         AND A.CREATED_DATE >= TO_DATE(:created_date ,'YYYYMMDDHH24MISS')
         AND A.CREATED_DATE < TO_DATE(:created_end_date ,'YYYYMMDDHH24MISS')
         GROUP BY B.USERNAME 
         HAVING COUNT(CLASS_ID) > 10
        ) T1
      ) AVG_FROM_TOTAL,
      A.MATH,
      (SELECT AVG(MATH) FROM 
        (SELECT B.USERNAME, SUM(CASE WHEN ROOM_ID = '1001' THEN 1 ELSE 0 END) AS MATH
         FROM A LESSON, STUDENT B
         WHERE A.USERNAME = B.USERNAME                    
         AND A.CREATED_DATE >= TO_DATE(:created_date ,'YYYYMMDDHH24MISS')
         AND A.CREATED_DATE < TO_DATE(:created_end_date ,'YYYYMMDDHH24MISS')
         GROUP BY B.USERNAME 
         HAVING COUNT(CLASS_ID) > 10
        ) T2
      ) AVG_FROM_MATH
    FROM 
      (SELECT 
         B.USERNAME,     
         COUNT(CLASS_ID) TOTAL,   
         SUM(CASE WHEN ROOM_ID = '1001' THEN 1 ELSE 0 END) AS MATH
       FROM A LESSON, STUDENT B
       WHERE A.USERNAME = B.USERNAME                    
       AND A.CREATED_DATE >= TO_DATE(:created_date ,'YYYYMMDDHH24MISS')
       AND A.CREATED_DATE < TO_DATE(:created_end_date ,'YYYYMMDDHH24MISS')
       GROUP BY B.USERNAME 
       HAVING COUNT(CLASS_ID) > 10
       ORDER BY TOTAL DESC
      ) A
    

    En esta consulta modificada, hay dos subconsultas que calculan el promedio de las columnas de total y matemáticas. Estas subconsultas filtran los nombres de usuario que tienen menos de 10 clases y luego calculan el promedio de los resultados restantes.

    Tenga en cuenta que las subconsultas se colocan dentro de la declaración select de la consulta principal y se refieren a las mismas tablas y condiciones que la consulta principal. Esto asegura que las subconsultas usen el mismo conjunto de datos que la consulta principal y calculen los promedios correctos.

    También tenga en cuenta que en las subconsultas, se filtra el resultado para excluir a los usuarios Matt y Jane ya que son demasiado bajos en comparación con otros.

    El resultado de esta consulta modificada sería así:

    |USERNAME|TOTAL|AVG_FROM_TOTAL|MATH|AVG_FROM_MATH|              
    |John    |  480|      476     | 159|     137     |
    |Dave    |  360|      476     | 120|     137     |
    |Sarah   |  540|      476     | 130|     137     |
    |James   |  361|      476     | 185|     137     |
    |Kim     |  640|      476     |  92|     137     |
    

Comments are closed.