Saber si una subconsulta no devolvio

02/11/2005 - 15:05 por Matías | Informe spam
Hola a todos, en un sp me hace falta saber si alguna de las 2 subconsultas
que utilizo para calcular la columna PromFinal no me devuelve ningún
registro, entonces no debo dividir por 2.

IDEtapa 1 y 2):
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2

CREATE PROCEDURE pa_select_notas_por_cur_mat_1y2etapa (@Curso as char(3),
@IdMateria as int) AS
SELECT A.Apellidos+', '+A.Nombres as Alumno,
CASE WHEN N1.IDEtapa = 1 THEN N1.Nota ELSE NULL END AS Nota1Et,
CASE WHEN N1.IDEtapa = 2 THEN N1.Nota ELSE NULL END AS Nota2Et,
CASE WHEN N1.IDEtapa = 1 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen1Et,
CASE WHEN N1.IDEtapa = 2 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen2Et,
E.Descripcion as Etapa, M.Nombre as Materia, N1.Curso,
Prom1Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1),
Prom2Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2),
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE (N1.IDEtapa = 1 or N1.IDEtapa = 2) AND A.Curso = @Curso AND
N1.IdMateria = @IdMateria
ORDER BY A.Apellidos, A.Nombres, N1.IDEtapa

saludos y gracias.

Preguntas similare

Leer las respuestas

#1 Eleazar
02/11/2005 - 15:44 | Informe spam
si no devuelve valor la subconsulta entonces puede ser cero por default, o
porque no debes dividir?
por lo que entiendo estas sumando 2 valores y los divides entre 2
prueba con el isnull()

PromFinal = (ISNULL((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1),0)
+
ISNULL((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2),0)
)/2

"Matías" escribió en el mensaje
news:
Hola a todos, en un sp me hace falta saber si alguna de las 2 subconsultas
que utilizo para calcular la columna PromFinal no me devuelve ningún
registro, entonces no debo dividir por 2.

IDEtapa 1 y 2):
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2

CREATE PROCEDURE pa_select_notas_por_cur_mat_1y2etapa (@Curso as char(3),
@IdMateria as int) AS
SELECT A.Apellidos+', '+A.Nombres as Alumno,
CASE WHEN N1.IDEtapa = 1 THEN N1.Nota ELSE NULL END AS Nota1Et,
CASE WHEN N1.IDEtapa = 2 THEN N1.Nota ELSE NULL END AS Nota2Et,
CASE WHEN N1.IDEtapa = 1 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen1Et,
CASE WHEN N1.IDEtapa = 2 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen2Et,
E.Descripcion as Etapa, M.Nombre as Materia, N1.Curso,
Prom1Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND


N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1),
Prom2Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND


N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2),
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE (N1.IDEtapa = 1 or N1.IDEtapa = 2) AND A.Curso = @Curso AND
N1.IdMateria = @IdMateria
ORDER BY A.Apellidos, A.Nombres, N1.IDEtapa

saludos y gracias.


Respuesta Responder a este mensaje
#2 Eleazar
02/11/2005 - 15:49 | Informe spam
puedes simplificar el query sumando idetapa 1 y 2

PromFinal = ISNULL(SELECT ROUND(AVG(CAST(Sum(N2.Nota) as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa Between 1 And 2)
,0)/2
"Matías" escribió en el mensaje
news:
Hola a todos, en un sp me hace falta saber si alguna de las 2 subconsultas
que utilizo para calcular la columna PromFinal no me devuelve ningún
registro, entonces no debo dividir por 2.

IDEtapa 1 y 2):
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2

CREATE PROCEDURE pa_select_notas_por_cur_mat_1y2etapa (@Curso as char(3),
@IdMateria as int) AS
SELECT A.Apellidos+', '+A.Nombres as Alumno,
CASE WHEN N1.IDEtapa = 1 THEN N1.Nota ELSE NULL END AS Nota1Et,
CASE WHEN N1.IDEtapa = 2 THEN N1.Nota ELSE NULL END AS Nota2Et,
CASE WHEN N1.IDEtapa = 1 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen1Et,
CASE WHEN N1.IDEtapa = 2 THEN CONVERT(char(10),N1.FechaExamen,103) ELSE ''
END AS FechaExamen2Et,
E.Descripcion as Etapa, M.Nombre as Materia, N1.Curso,
Prom1Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND


N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1),
Prom2Etapa = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDEtapa = N1.IDEtapa AND


N2.IDMateria
= N1.IDMateria AND N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2),
PromFinal = ((SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 1)
+
(SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.CURSO = N1.CURSO AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND N2.IDEtapa = 2))/2
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE (N1.IDEtapa = 1 or N1.IDEtapa = 2) AND A.Curso = @Curso AND
N1.IdMateria = @IdMateria
ORDER BY A.Apellidos, A.Nombres, N1.IDEtapa

saludos y gracias.


Respuesta Responder a este mensaje
#3 Matías
02/11/2005 - 16:37 | Informe spam
sip, habia probado con ISNULL pero el problema es que si alguno da null, lo
reemplazo por 0 y me sale mal el promedio.

Tu otra opción de simplificar el query sumando idetapa 1 y 2 me parece que
no la podía utilizar por un problemilla de redondeo, lamentablemente ahora
no lo puedo verifcar(no tengo a mano la bd hasta dentro de 8hs). Me parece
que no me daba el mismo resultado calculando por separado el promedio de la
primera y segunda etapa y luego dividir, que utilizando el query sumando
idetapa 1 y 2.
Ya que el metodo real para sacar el promedio final es: (PromedioEtapa1 +
PromedioEtapa2)/2

Gracias por tu tiempo, habrá otra alternativa?
Respuesta Responder a este mensaje
#4 Eleazar
02/11/2005 - 20:06 | Informe spam
si esta informacion la muestras en la aplicacion o reporte (front) desde
alli debes hacer las operaciones, sumas y sacas promedio por cada alumno
porque desde el back es mas complicado (y quiza menos rapido) en dado caso
deberas hacer un case tal como lo haces para las columnas Nota1Et y Nota2Et
ejemplo
Case When (subselect1) is NOT null And (subselect2) is NoT null
then (subselect2)+(subselect2)/2
Else 0
End

"Matías" escribió en el mensaje
news:
sip, habia probado con ISNULL pero el problema es que si alguno da null,


lo
reemplazo por 0 y me sale mal el promedio.

Tu otra opción de simplificar el query sumando idetapa 1 y 2 me parece que
no la podía utilizar por un problemilla de redondeo, lamentablemente ahora
no lo puedo verifcar(no tengo a mano la bd hasta dentro de 8hs). Me parece
que no me daba el mismo resultado calculando por separado el promedio de


la
primera y segunda etapa y luego dividir, que utilizando el query sumando
idetapa 1 y 2.
Ya que el metodo real para sacar el promedio final es: (PromedioEtapa1 +
PromedioEtapa2)/2

Gracias por tu tiempo, habrá otra alternativa?


Respuesta Responder a este mensaje
#5 Matías
02/11/2005 - 21:34 | Informe spam
OK, GRACIAS, te comento que lo tengo que hacer en el SP, ya que además de
emitirlo en un reporte(ActiveReport) tengo que emitir el resultado de la
consulta a Excel.
Además este select me sirve de punto de partida(para otros procesos) para
saber por Ej. que alumnos se llevan materias a rendir, cuántas, etc(por eso
me hace falta si o si el PromedioFinal).
Voy a probar con el Case When (subselect1) ..

Saludos cordiales.

"Eleazar" escribió en el mensaje
news:OX3n5A%
si esta informacion la muestras en la aplicacion o reporte (front) desde
alli debes hacer las operaciones, sumas y sacas promedio por cada alumno
porque desde el back es mas complicado (y quiza menos rapido) en dado caso
deberas hacer un case tal como lo haces para las columnas Nota1Et y


Nota2Et
ejemplo
Case When (subselect1) is NOT null And (subselect2) is NoT null
then (subselect2)+(subselect2)/2
Else 0
End

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida