locked
Calcular campo en consulta RRS feed

  • Pregunta

  • Como estan?

     

    En una consulta calculo un campo la nota definitiva, y sobre ese campo quiero realizar una comprobacion asi:

    Code Snippet (Parte de la consulta)
    SUM(ENo.Nota / 100 * (Rq.Porcentaje))) as Def,

    CASE

      WHEN Def <= 2.9 THEN 'PERDISTE'

      WHEN Def > 2.9 AND Def <= 3.4 THEN 'REPITE'

    END AS Observacion

     

    Pero cuando la ejecuto me aparece el siguiente error: El nombre de columna 'Def' no es válido. No hay forma de calcular el campo una vez y no cada vez que quiera hacer una comparacion para la observacion, eso no afecta el rendimiento de la consulta. Por sus comentarios muchas gracias.

    miércoles, 6 de junio de 2007 13:56

Respuestas

  • Hay que volver a poner la expresion calculada en cada WHEN, por ejemplo:

    USE TempDb
    GO
    
    CREATE TABLE t (col1 int, col2 int)
    GO
    
    INSERT t VALUES (10,20)
    INSERT t VALUES (30,20)
    INSERT t VALUES (20,20)
    GO
    
    SELECT 
       col1, 
       col2, 
       (col1+col2)*0.5 as promedio,
       CASE
    	WHEN (col1+col2)*0.5 > 20.0 THEN '> 20'
    	WHEN (col1+col2)*0.5 <= 20.0 THEN '<= 20'
       END AS observacion	
    FROM t
    

    Gustavo Larriera Sosa [ascii164.blogspot.com] /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    miércoles, 4 de noviembre de 2009 13:18
    Moderador

Todas las respuestas

  • ¿Qué tal si pones toda la consulta?
    Saludos
    miércoles, 6 de junio de 2007 20:28
  • Esta es la consulta

     

    SELECT Codigo, Mo.Descrp AS Modulo, Mo.No_Creditos AS Creditos,

    CASE

    WHEN dbo.Redondear(SUM(ENo.Nota / 100 * (Rq.Porcentaje))) <= 2.9 THEN 'MODULO PERDIDO'

    WHEN dbo.Redondear(SUM(ENo.Nota / 100 * (Rq.Porcentaje))) > 2.9 AND

    dbo.Redondear(SUM(ENo.Nota / 100 * (Rq.Porcentaje))) <= 3.4 THEN 'MODULO A RECUPERAR'

    END AS Observacion

    FROM E_Modulo_Mat AS MM INNER JOIN

    E_Notas AS ENo ON MM.Cod_ModM = ENo.Cod_ModM INNER JOIN

    M_Requerimiento_Nota AS Rq ON ENo.Cod_Req = Rq.Cod_Req INNER JOIN

    E_Semestre_Periodo AS SP ON MM.Cod_SemP = SP.Cod_SemP INNER JOIN

    M_Horario_Modulo AS HM ON HM.Cod_HorM = MM.Cod_HorM INNER JOIN

    P_Modulo AS Mo ON Mo.Cod_ModI = HM.Cod_ModI

    WHERE (SP.Cod_CI = @CarreraInscrita) And (SP.Activo = 1)

    GROUP BY Mo.Cod_Car + Mo.Sem + Mo.Cod_Mod, Mo.No_Creditos, Mo.Descrp

    HAVING dbo.Redondear(SUM(ENo.Nota / 100 * (Rq.Porcentaje))) < 3.5

     

    La idea es que no tenga que hacer esa operacion cada vez que quiera realizar una validacion sobre el. Muchas gracias.

    miércoles, 6 de junio de 2007 20:42
  • Perdon Daniel, no entendi que es lo que deseas hacer, ¿este ultimo query no funciona?
    jueves, 7 de junio de 2007 19:48
  • Que tal Isaias?

     

    Lo que quiero saber es si, cuando creo un campo calculado como la 'definitiva' pueda hacer referencia a el sin tener que realizar la misma operacion cada vez que quiera realizar una validadcion; como si fuera un campo más.

     

    La consulta si funciona, pero tengo que repetir la operacion varias veces y no se si eso lo adecuado.

    jueves, 7 de junio de 2007 22:29
  • Es totalmente correcto, el campo calculado, es un campo mas de tu tabla y puedes hacer referencia de el, donde gustes.
    jueves, 7 de junio de 2007 23:22
  • Que tal Isaias!

     

    Si, es cierto, lo que pasa es que este no es un campo calculado de la tabla, si no de la consulta. Entonces aplicara el mismo concepto?

    Otra pregunta, el campo calculado (de la tabla), si es recomendable usarlo?

     

    Gracias, por sus comentarios?

     

    jueves, 7 de junio de 2007 23:43
  • Claro Daniel, es recomendable USARLOS, asi te evitaras bastante codigo.
    viernes, 8 de junio de 2007 15:08
  • Que tal!

     

    Entonces empezara a acomodar mis tablas, por que es cierto, que mano 'e codigo que me ahorraria, muchas gracias Isaias.

     

    Saludos

    viernes, 8 de junio de 2007 15:27
  • Hay que volver a poner la expresion calculada en cada WHEN, por ejemplo:

    USE TempDb
    GO
    
    CREATE TABLE t (col1 int, col2 int)
    GO
    
    INSERT t VALUES (10,20)
    INSERT t VALUES (30,20)
    INSERT t VALUES (20,20)
    GO
    
    SELECT 
       col1, 
       col2, 
       (col1+col2)*0.5 as promedio,
       CASE
    	WHEN (col1+col2)*0.5 > 20.0 THEN '> 20'
    	WHEN (col1+col2)*0.5 <= 20.0 THEN '<= 20'
       END AS observacion	
    FROM t
    

    Gustavo Larriera Sosa [ascii164.blogspot.com] /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    miércoles, 4 de noviembre de 2009 13:18
    Moderador