none
Calcular promedio de varias columnas RRS feed

  • Pregunta

  • Hola

    Solicito amablemente su colaboración con la siguiente duda

    Se tiene la tabla:

    CREATE TABLE NOTAS ( ID INT NOT NULL IDENTITY, COLEGIO VARCHAR(50), ESTUDIANTE VARCHAR(50), MATERIA VARCHAR(50), ACTIVIDAD VARCHAR(300), NOTA DECIMAL(18,1), PERIODO VARCHAR(50), REGISTRA VARCHAR(50), PRIMARY KEY (ID));

    Con los siguientes datos:

    INSERT INTO NOTAS (COLEGIO, ESTUDIANTE, MATERIA, ACTIVIDAD, NOTA, PERIODO, REGISTRA) VALUES ('PRUEBAS', 'JUAN', 'MATEMATICAS', 'EJEMPLO1',10, '1', 'DOCENTE');
    INSERT INTO NOTAS (COLEGIO, ESTUDIANTE, MATERIA, ACTIVIDAD, NOTA, PERIODO, REGISTRA) VALUES ('PRUEBAS', 'JUAN', 'MATEMATICAS', 'EJEMPLO1', 10, '1', 'ESTUDIANTE');
    

    Con la siguiente consulta se obtiene las sumatoria de nota para cada periodo

    WITH REPORTE AS (
    SELECT MATERIA, sum(NOTA * 80 / 100) AS NOTA, cast(PERIODO as int) as PERIODO, count(*) as veces,1 AS GRUPO from NOTAS 
    WHERE REGISTRA = 'DOCENTE' AND ESTUDIANTE='JUAN'
    group by materia, periodo                                                                                             
    UNION ALL                                                                                                             
    SELECT MATERIA,SUM(nota * 20 / 100) AS NOTA, cast(PERIODO as int) as PERIODO, count(*) as veces,2 AS GRUPO from NOTAS  
    WHERE REGISTRA = 'ESTUDIANTE'  AND ESTUDIANTE='JUAN'
    group by materia,periodo),                                                                                            
    MEDIAS AS (                                                                                                           
    SELECT MATERIA,PERIODO, NOTA / VECES AS NOTA,GRUPO FROM REPORTE) SELECT MATERIA,                                      
    SUM(CASE WHEN PERIODO = 1 THEN NOTA END) AS I,                                                                        
    SUM(CASE WHEN PERIODO = 2 THEN NOTA END) AS II,                                                                       
    SUM(CASE WHEN PERIODO = 3 THEN NOTA END) AS III,   
    SUM(CASE WHEN PERIODO = 4 THEN NOTA END) AS IV,                                                                    
    AVG(NOTA) AS TOTAL                                                                                               
    FROM MEDIAS                                                                                                           
    GROUP BY MATERIA;

    El resultado es el siguiente:

    La consulta es:

    ¿Por que si la consulta es AVG el campo TOTAL muestra 5 y no 10?

    !Muchas gracias!


    Respuesta de foro Microsoft

    miércoles, 2 de diciembre de 2020 14:15

Respuestas

  • Hola yulfredy:

    Como te han explicado, estas obteniendo dos filas, en el conjunto intermedio, llamado medias, por tanto avg realiza la suma de las notas / de las filas.

    Reamente en ese conjunto no necesitas los grupos, puesto que no te aportan nada, y podrías sumar las notas / veces para obtener lo esperado.

    With reporte
    	 As (Select materia
    			  , Sum(nota * 80 / 100) As nota
    			  , Cast(periodo As Int) As periodo
    			  , Count(*) As veces
    			  , 1 As grupo
    				From notas
    				Where registra = 'DOCENTE' And estudiante = 'JUAN'
    				Group By materia
    					   , periodo
    		 Union All
    		 Select materia
    			  , Sum(nota * 20 / 100) As nota
    			  , Cast(periodo As Int) As periodo
    			  , Count(*) As veces
    			  , 2 As grupo
    				From notas
    				Where registra = 'ESTUDIANTE' And estudiante = 'JUAN'
    				Group By materia
    					   , periodo),
    	 medias
    	 As (Select materia
    			  , periodo
    			  , sum(nota / veces) As nota
    -- sumamos las notas / veces para obtener una sola fila por materia y periodo.
    				From reporte
    				group by materia, periodo
    			)
    	 Select materia
    		  , Sum(Case
    				When periodo = 1 Then nota
    			End) As i
    		  , Sum(Case
    				When periodo = 2 Then nota
    			End) As ii
    		  , Sum(Case
    				When periodo = 3 Then nota
    			End) As iii
    		  , Sum(Case
    				When periodo = 4 Then nota
    			End) As iv
    		  , Avg(nota) As total
    		  
    			From medias
    			Group By materia;

    • Marcado como respuesta yulfredy miércoles, 2 de diciembre de 2020 21:20
    miércoles, 2 de diciembre de 2020 20:21

Todas las respuestas

  • Lo tienes muy sencillo, simplemente con que hagas una select sobre la CTE Medias te vas a dar cuenta.

    select * from medias

    Obtienes este resultado

    MATEMATICAS 1 8.000000 1
    MATEMATICAS 1 2.000000 2

    El AVG lo estas calculando sobre este resultado agrupando por Materia, por lo tanto te hace 8 + 2 / 2= 5

    El problema es que quizá no estés obteniendo los datos que esperas en las CTEs anteriores

    Un saludo


    miércoles, 2 de diciembre de 2020 16:46
  • Hola yulfredy:

    Como te han explicado, estas obteniendo dos filas, en el conjunto intermedio, llamado medias, por tanto avg realiza la suma de las notas / de las filas.

    Reamente en ese conjunto no necesitas los grupos, puesto que no te aportan nada, y podrías sumar las notas / veces para obtener lo esperado.

    With reporte
    	 As (Select materia
    			  , Sum(nota * 80 / 100) As nota
    			  , Cast(periodo As Int) As periodo
    			  , Count(*) As veces
    			  , 1 As grupo
    				From notas
    				Where registra = 'DOCENTE' And estudiante = 'JUAN'
    				Group By materia
    					   , periodo
    		 Union All
    		 Select materia
    			  , Sum(nota * 20 / 100) As nota
    			  , Cast(periodo As Int) As periodo
    			  , Count(*) As veces
    			  , 2 As grupo
    				From notas
    				Where registra = 'ESTUDIANTE' And estudiante = 'JUAN'
    				Group By materia
    					   , periodo),
    	 medias
    	 As (Select materia
    			  , periodo
    			  , sum(nota / veces) As nota
    -- sumamos las notas / veces para obtener una sola fila por materia y periodo.
    				From reporte
    				group by materia, periodo
    			)
    	 Select materia
    		  , Sum(Case
    				When periodo = 1 Then nota
    			End) As i
    		  , Sum(Case
    				When periodo = 2 Then nota
    			End) As ii
    		  , Sum(Case
    				When periodo = 3 Then nota
    			End) As iii
    		  , Sum(Case
    				When periodo = 4 Then nota
    			End) As iv
    		  , Avg(nota) As total
    		  
    			From medias
    			Group By materia;

    • Marcado como respuesta yulfredy miércoles, 2 de diciembre de 2020 21:20
    miércoles, 2 de diciembre de 2020 20:21