none
Calcular Promedio del Campo Calificacion en una tabla Nota de sql y c# RRS feed

  • Pregunta

  • Lo que necesito saber es como traer de sql a c# el calculo del promedio de las notas de un estudiante por asignatura en un periodo y promedio general del mismo  en los cuatro periodos y mostrarlo en un formulario de c#, 

    por ejemplo se que con la funcion AVG se saca el promedio pero como lo hago para mostrar los resultados en c# si trabajo con 3 capas y que me traiga los resultados solo de un estudiante

    si tengo por ej

    insertado los siguientes registros 

       Calificacion    Tipo_Cal                          Periodo        Fecha                  Asignatura          Cod_Est

    1      4,5         Examen                                   1             17/01/2017            Matemática          10

    2     4,3            Examen                               1             17/01/2017            Matemática            11

    3     3,3            Examen                               1             17/01/2017            Matemática            11

    4      4,3           Examen                               1             17/01/2017            Matemática           10

    5     4,4           Examen                               1             17/01/2017            Lenguaje           11

    create table Nota
    (
    Cod_Nota int IDENTITY (1,1) PRIMARY KEY,
    Calificacion decimal(4,2) (50) not null,
    Tipo_Cali  varchar (50) not null,
    Periodo_Cal varchar (50) not null,
    Fecha_Cal date not null,
    Asignatura varchar (50) not null,
    Cod_Est int not null
    )

    martes, 17 de enero de 2017 21:49

Todas las respuestas

  • Practicando,

    Para el primer caso agrupa las filas por las columnas [Periodo] y [Asignatura] y muestra el promedio de la columna [Calificacion], para el segundo caso agrupa únicamente por la columna [Periodo], algo como:

    /*Promedio por asignatura*/
    SELECT
        n.Periodo_Cal, n.Asignatura,
        AVG(n.Calificacion) AS [PromedioAsignatura]
    FROM
        Nota n
    GROUP BY
        n.Periodo_Cal, n.Asignatura;
    
    /*Promedio general*/
    SELECT
        n.Periodo_Cal,
        AVG(n.Calificacion) AS [PromedioTotal]
    FROM
        Nota n
    GROUP BY
        n.Periodo_Cal;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 17 de enero de 2017 22:04
  • Muchas gracias Willian  por tus siempre oportunas resp

    pero sigo teniendo preguntas

    esa consulta la hago en sql o directamente en c#   ???

    lo que pasa es que asi  la hago en sql y me esta mostrando resultado el promedio de todos las notas de todos los alumnos yo necesito que sea solo la de un cod_est por ejemplo el cod_est=13 cual seria el promedio de ese alumno en un periodo y cual seria el promedio de el en los cuatro periodos.

    si es en sql como ver esta consulta reflejada en c#  lo que pasa es que el resto d ela aplicación la tengo en capas y no se como hacer 

    si lo hago como un procedimiento almacendao en sql como spmostrar_Nota    óooo    como le hago  si tenes un ejemplo de una tabla Nota o Calificaciones seria para guiarme....

    de antemano muchas gracias y muy pertienentes respuestas 

    miércoles, 18 de enero de 2017 4:57
  • Hola, me parece que te está faltando un poco de estructura en la BD deberías gtener una tabla Asignatura y una de estudiantes,

    CREATE TABLE Asignatura
    (
    IdAsignatura INT PRIMARY KEY,
    Asignatura   VARCHAR(50)
    )
    
    INSERT INTO Asignatura(IdAsignatura,Asignatura)
    VALUES (1,'MATEMÁTICA')
    INSERT INTO Asignatura(IdAsignatura,Asignatura)
    VALUES (2,'LENGUAJE')
    
    CREATE TABLE Nota
    (
    Cod_Nota INT IDENTITY (1,1) PRIMARY KEY,
    Calificacion DECIMAL(4,2)  NOT NULL,
    Tipo_Cali  VARCHAR (50) NOT NULL,
    Periodo_Cal VARCHAR (50) NOT NULL,
    Fecha_Cal DATE NOT NULL,
    Asignatura VARCHAR (50) NOT NULL,
    IdAsignatura INT NOT NULL,
    Cod_Est INT NOT NULL
    CONSTRAINT FK_NOTA_ASIGNATURA FOREIGN KEY (IdAsignatura) REFERENCES ASIGNATURA(IdAsignatura)
    )
    
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(4.5,'Examen','1','17/01/2017','Matemática',1,10)
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(4.3,'Examen','1','17/01/2017','Matemática',1,11)
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(3.3,'Examen','1','17/01/2017','Matemática',1,11)
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(4.3,'Examen','1','17/01/2017','Matemática',1,10)
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(4.4,'Examen','1','17/01/2017','Lenguaje',2,11)
    insert into Nota (Calificacion,Tipo_Cali,Periodo_Cal,Fecha_Cal,Asignatura,IdAsignatura,Cod_Est)values(4.4,'Examen','2','21/04/2017','Lenguaje',2,11)

    puedes crear el procedure que querías con los null como comodines para que cuando envíes un parámetro se filtre y cuando no te muestre todos los resultados,

    CREATE PROCEDURE spmostrar_Nota    
    (
    @Periodo_Cal VARCHAR (50),
    @Cod_Est      INT,
    @IdAsignatura  INT
    )
    AS
    SELECT Promedio= AVG(Calificacion),Cod_Est,Asignatura,Periodo_Cal FROM Nota
    WHERE Cod_Est=@Cod_Est
    AND
    Periodo_Cal=CASE WHEN @Periodo_Cal IS NOT NULL THEN Periodo_Cal ELSE Periodo_Cal END
    AND
    IdAsignatura=CASE WHEN @IdAsignatura IS NOT NULL THEN @IdAsignatura ELSE IdAsignatura END
    
    GROUP BY Cod_Est,Asignatura,Periodo_Cal
    
    
    --spmostrar_Nota  1,11,null


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.


    lunes, 23 de enero de 2017 19:28
  • HOLA WILIAMS

    De nuevo molestándote solo que me había tocado salir fuera de la ciudada

    lo q pasa  es que eso q me mandas, lo que hace es q me suma todas las notas de todos los estudiantes y las divide entre la cantidad de los estudiantes registrados y la idea es que me saque el promedio individual de cada uno de estos.

    asi como esta hay por ejemplo si meto las calificaciones de tres estudiantes diferente y la sumas de las notas de todos da 20 el promedio me muestra 4 y debería ser por ejemplo que de uno las notas son (3, 3, 3) el promedio de este debe ser 3 y asi sucesivamente y asi con otro que tienen (4, 4, 4) el promedio de este estudiante debería ser 4.

    espero me haga entender y puedas ayudarme aunq voy a seguir tratando de ver que hago

    create proc Rpt_Notas
    as
    SELECT
       N.Periodo, N.Asignatura,
        AVG(N.Calificacion) AS [ProAsignatura]
    FROM
        Notas N
    GROUP BY
        N.Periodo, N.Asignatura;
    GO

    martes, 31 de enero de 2017 2:53
  • Hola compañero Augusto1982, veo un erro en la creación de la tabla Nota.

    CREATE TABLE Nota
    (
    Cod_Nota INT IDENTITY (1,1) PRIMARY KEY,
    Calificacion DECIMAL(4,2)  NOT NULL,
    Tipo_Cali  VARCHAR (50) NOT NULL,
    Periodo_Cal VARCHAR (50) NOT NULL,
    Fecha_Cal DATE NOT NULL,
    Asignatura VARCHAR (50) NOT NULL,
    IdAsignatura INT NOT NULL,
    Cod_Est INT NOT NULL
    CONSTRAINT FK_NOTA_ASIGNATURA FOREIGN KEY (IdAsignatura) REFERENCES ASIGNATURA(IdAsignatura)
    )

    Le sobra este campo (Asignatura VARCHAR (50) NOT NULL,), ya que esta información esta en la tabla (Asignatura), lo cual es redundancia de información

    sábado, 16 de enero de 2021 23:28