none
Calcular y copiar datos entre tablas RRS feed

  • Pregunta

  • Tabla Registro Notas

    Num_Estudiante  Codigo_Clase  Termino  N1 N2  N3  N4  

           1010                 15                12       A    C    A   B     

    A = 4     B=3     C=2     D=1     F=0    en este caso seria    4+2+4+3  / 4   Promedio 3.25

    > 3.50 A    > 2.50  B     >1.60  C    >.79 D   si no F                                 Nota_Final   B        

    TABLA NOTAS ESTUDIANTES

    Num_Estudiante   Codigo_Clase  Termino   Promedio     Nota_Final

            1010                 15                  12        3.25               B       

    SI LOS DATOS NO EXISTEN EN LA TABLA NOTAS ESTUDIANTE ENTONCES SELECT INSERT CON SUS DEBIDOS CALCULOS SI EXISTE ENTONCES SELECT UPDATE  LOS PARAMETROS SERIAN NUM_ESTUDIANTE   CODIGO_CLASE Y TERMINO


    sábado, 28 de julio de 2018 21:00

Todas las respuestas

  • Hola EfrainDiaz:

    Una solución a tu pregunta pasa por ejemplo por esto:

    CREATE TABLE RegistroNotas
    (NumEst  VARCHAR(10),
     codigo  INT,
     termino INT,
     nota1   CHAR,
     nota2   CHAR,
     nota3   CHAR,
     nota4   CHAR
    );
    GO
    INSERT INTO RegistroNotas
    (NumEst,
     codigo,
     termino,
     nota1,
     nota2,
     nota3,
     nota4
    )
    VALUES
    ('1010',
     15,
     12,
     'A',
     'C',
     'A',
     'B'
    ),
    ('1010',
     15,
     13,
     'A',
     'C',
     'A',
     'B'
    ),
    ('1010',
     14,
     11,
     'A',
     'C',
     'A',
     'B'
    ),
    ('1020',
     15,
     12,
     'A',
     'C',
     'A',
     'B'
    );
    GO
    CREATE TABLE NOTASFinales
    (numest    VARCHAR(10),
     codigo    INT,
     termino   INT,
     promedio  FLOAT,
     notaFinal CHAR
    );
    GO
    WITH CTE
         AS (
         SELECT numEst,
                codigo,
                termino,
                CASE NOTA1
                    WHEN 'A'
                    THEN 4
                    WHEN 'B'
                    THEN 3
                    WHEN 'C'
                    THEN 2
                    WHEN 'D'
                    THEN 1
                    WHEN 'F'
                    THEN 0
                END AS NOTA1,
                CASE NOTA2
                    WHEN 'A'
                    THEN 4
                    WHEN 'B'
                    THEN 3
                    WHEN 'C'
                    THEN 2
                    WHEN 'D'
                    THEN 1
                    WHEN 'F'
                    THEN 0
                END AS NOTA2,
                CASE NOTA3
                    WHEN 'A'
                    THEN 4
                    WHEN 'B'
                    THEN 3
                    WHEN 'C'
                    THEN 2
                    WHEN 'D'
                    THEN 1
                    WHEN 'F'
                    THEN 0
                END AS NOTA3,
                CASE NOTA4
                    WHEN 'A'
                    THEN 4
                    WHEN 'B'
                    THEN 3
                    WHEN 'C'
                    THEN 2
                    WHEN 'D'
                    THEN 1
                    WHEN 'F'
                    THEN 0
                END AS NOTA4
         FROM RegistroNotas
    
    /*si se pueden repetir entonces, a cada nota1 le haces un sum(case.... end) as NOTA1 y lo agrupas por numest, codigo y termino. dentro del cte*/
    
         )
         MERGE NotasFinales AS Target
         USING
    (
        SELECT c.NumEst,
               c.codigo,
               c.termino,
               (CAST(c.NOTA1 AS FLOAT) + CAST(c.NOTA2 AS FLOAT) + CAST(c.NOTA3 AS FLOAT) + CAST(c.NOTA4 AS FLOAT)) / 4 AS promedio,
               CASE
                   WHEN((CAST(c.NOTA1 AS FLOAT) + CAST(c.NOTA2 AS FLOAT) + CAST(c.NOTA3 AS FLOAT) + CAST(c.NOTA4 AS FLOAT)) / 4) > 3.5
                   THEN 'A'
                   WHEN((CAST(c.NOTA1 AS FLOAT) + CAST(c.NOTA2 AS FLOAT) + CAST(c.NOTA3 AS FLOAT) + CAST(c.NOTA4 AS FLOAT)) / 4) > 2.5
                   THEN 'B'
                   WHEN((CAST(c.NOTA1 AS FLOAT) + CAST(c.NOTA2 AS FLOAT) + CAST(c.NOTA3 AS FLOAT) + CAST(c.NOTA4 AS FLOAT)) / 4) > 1.6
                   THEN 'C'
                   WHEN((CAST(c.NOTA1 AS FLOAT) + CAST(c.NOTA2 AS FLOAT) + CAST(c.NOTA3 AS FLOAT) + CAST(c.NOTA4 AS FLOAT)) / 4) > 0.79
                   THEN 'D'
                   ELSE 'F'
               END AS FINAL
        FROM CTE AS c
    ) AS source(numest, codigo, termino, promedio, notaFinal)
         ON(Target.numest = source.Numest
            AND target.codigo = source.codigo
            AND target.termino = source.termino)
             WHEN MATCHED
             THEN UPDATE SET
                             promedio = source.promedio,
                             notaFinal = source.notafinal
             WHEN NOT MATCHED
             THEN
               INSERT(numest,
                      codigo,
                      termino,
                      promedio,
                      notaFinal)
               VALUES
    (source.numest,
     source.codigo,
     source.termino,
     source.promedio,
     source.notafinal
    );
    
     
     
    Un saludo

    sábado, 11 de agosto de 2018 7:46