Ayuda con un sp.

17/05/2006 - 14:20 por Matías | Informe spam
Hola a todos, construí el siguientes sp, lo que hace es traerme un listado
de alumnos que no aprobaron materias en las
distintas etapas, esta funcionando bien(creo), pero el tema es que me hace
falta filtrar los alumnos solo tengan dos o mas materias en el resultado del
sp.
El sp devuelve(resumido):
Alumno Materia
-
GOMEZ, NELSON BIOLIGIA
GOMEZ, NELSON QUIMICA
SIMPSON, BARTOLOMEO FISICA

Me hace falta que solo devuelva:
Alumno Materia
-
GOMEZ, NELSON BIOLIGIA
GOMEZ, NELSON QUIMICA

SELECT * FROM (SELECT A.Apellidos+', '+ A.Nombres as Alumno, A.Legajo,
A.NroDocumento, N.IDAlumno, N.IDMateria, M.Codigo, M.Nombre as Materia, --
trae alum q no aprobaron porq no les dio el PromFinal o el Prom2Et
Prom2Et = (SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso),
ROUND(((SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 1 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso)
+
(SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso))/2, CASE
WHEN @RVP = 1 THEN 0 ELSE 2 END) PromFinal
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = @Anio
AND (N.IDEtapa = 1 or N.IDEtapa = 2) AND A.Curso = @Curso AND V.IdEstado 2
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.NroDocumento, N.IDAlumno,
N.IDMateria, M.Codigo, M.Nombre, A.IDAlumno, A.Curso, A.IDAlumno, V.IdEstado
) AS Coloquio
WHERE (PromFinal < @NotaMin OR Prom2Et < @NotaMin)
AND IDAlumno NOT IN
(SELECT N.IDAlumno-- indica los alumnos q se presentaron a rendir en
coloquio y aprobaron.
FROM NOTAS N
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = @Anio
AND N.IDEtapa = 3 AND A.Curso = @Curso
AND V.IdEstado = 2 AND N.Nota >= @NotaMin
GROUP BY N.IDAlumno)
AND IDAlumno NOT IN
(SELECT N.IDAlumno-- indica los alumnos q se presentaron a rendir en
Marzo y aprobaron.
FROM NOTAS N
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE N.IDEtapa = 4 AND A.Curso = @Curso
AND V.IdEstado = 2 AND N.Nota >= @NotaMin
GROUP BY N.IDAlumno)

Aunque sea que lo pueda resolver con un cursor.
Las tablas prinsipales son:
Alumno: *IDAlumno, (demas Campos)
Notas: *IDAlumno, *IDMateria, *IDEtapa, *Curso, Nota, FechaExamen
Materias:*IDMateria, (demas Campos)
(* campo clave)
Muchas Gracias. Perdon pero no pude ponerme a resumir un poco el sp.
 

Leer las respuestas

#1 Alejandro Mesa
17/05/2006 - 19:21 | Informe spam
Matías,

Puedes hacer lo sgte:

1 - crear una tabla temporal para capturar la salida del sp y luego hacer
una sentencia "select" sobre esa tabla temporal

create table #t (
alumno varchar(50) not null,
materia varchar(50) not null
)

insert into #t
exec dbo.usp_nombre_del_sp

select *
from #t as t1 inner join (select alumno from #t group by alumno having
count(distinct materia) > 1) as t2
on t1.alumno = t2.alumno

2 - En vez de capturar el resultado fuera del sp, lo puedes hacer dentro del
sp y usar la sentencia anterior (la que puse en el paso 1) para devolver las
filas desde el sp.

3 - Otra posibilidad es usar la sentencia que posteastes como una tabla
derivada. Eso no lo recomiendo en este caso porque la sentencia esta muy
complicada como para duplicar el codigo.


AMB


"Matías" wrote:

Hola a todos, construí el siguientes sp, lo que hace es traerme un listado
de alumnos que no aprobaron materias en las
distintas etapas, esta funcionando bien(creo), pero el tema es que me hace
falta filtrar los alumnos solo tengan dos o mas materias en el resultado del
sp.
El sp devuelve(resumido):
Alumno Materia
-
GOMEZ, NELSON BIOLIGIA
GOMEZ, NELSON QUIMICA
SIMPSON, BARTOLOMEO FISICA

Me hace falta que solo devuelva:
Alumno Materia
-
GOMEZ, NELSON BIOLIGIA
GOMEZ, NELSON QUIMICA

SELECT * FROM (SELECT A.Apellidos+', '+ A.Nombres as Alumno, A.Legajo,
A.NroDocumento, N.IDAlumno, N.IDMateria, M.Codigo, M.Nombre as Materia, --
trae alum q no aprobaron porq no les dio el PromFinal o el Prom2Et
Prom2Et = (SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso),
ROUND(((SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 1 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso)
+
(SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = @Anio AND A.Curso = @Curso))/2, CASE
WHEN @RVP = 1 THEN 0 ELSE 2 END) PromFinal
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = @Anio
AND (N.IDEtapa = 1 or N.IDEtapa = 2) AND A.Curso = @Curso AND V.IdEstado > 2
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.NroDocumento, N.IDAlumno,
N.IDMateria, M.Codigo, M.Nombre, A.IDAlumno, A.Curso, A.IDAlumno, V.IdEstado
) AS Coloquio
WHERE (PromFinal < @NotaMin OR Prom2Et < @NotaMin)
AND IDAlumno NOT IN
(SELECT N.IDAlumno-- indica los alumnos q se presentaron a rendir en
coloquio y aprobaron.
FROM NOTAS N
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = @Anio
AND N.IDEtapa = 3 AND A.Curso = @Curso
AND V.IdEstado = 2 AND N.Nota >= @NotaMin
GROUP BY N.IDAlumno)
AND IDAlumno NOT IN
(SELECT N.IDAlumno-- indica los alumnos q se presentaron a rendir en
Marzo y aprobaron.
FROM NOTAS N
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
INNER JOIN vw_ultimo_estado_alu V ON V.IDAlumno = A.IDAlumno
WHERE N.IDEtapa = 4 AND A.Curso = @Curso
AND V.IdEstado = 2 AND N.Nota >= @NotaMin
GROUP BY N.IDAlumno)

Aunque sea que lo pueda resolver con un cursor.
Las tablas prinsipales son:
Alumno: *IDAlumno, (demas Campos)
Notas: *IDAlumno, *IDMateria, *IDEtapa, *Curso, Nota, FechaExamen
Materias:*IDMateria, (demas Campos)
(* campo clave)
Muchas Gracias. Perdon pero no pude ponerme a resumir un poco el sp.



Preguntas similares