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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 Matías
17/05/2006 - 20:36 | Informe spam
Muchas gracias Alejandro, esta noche pruebo las opciones.
Saludos.

"Alejandro Mesa" escribió en el
mensaje news:
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.
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida