Está en la página 1de 31

1.

Modificacin de datos con condicional


/*Modificacion de datos con condicional*/ update matricula set nota='NSP' where (nota is null) update matricula set nota='05' where (nota='NSP') /*Modificacion de datos con varios atributos*/ update matricula set nota='NSP', semestre='2009-II' where nota is null /*Modificacion de datos con la clausula from*/ update asignatura set credito= a.credito+1 from asignatura a where a.codCarrera='SI' /*Se, tiene un grupo de estudiantes matriculados en el semestre 2010-I, en el cual se realizan cambios en La curricula de la carrera profesional de ingeniria de sistemas, en la cual modifican el codigo de la asignatura de Base de Datos II y al mismo tiempo se desea mdificar la nota de los estudiantes que tiene valor de nulo a NSP*/ update matricula set codAsignatura='IIAA62',nota='NSP' where (codAsignatura='IIAA61') and nota is null

2. Tablas Temporales Tienen un comportamiento similar a una tabla fsica, con la ventaja que tienen un tiempo determinado de validez.
--Numero de estudiantes matriculados por semestre y carrera --profesional select m.*, e.codCarrera into #matriculaCP from matricula m left outer join estudiante e on m.codEstudiante=e.codEstudiante select semestre, codCarrera, count(distinct codEstudiante) nroMatriculados into #estudiantesSemestre from #matriculaCP group by semestre, codCarrera order by semestre, codCarrera select e.semestre, e.codCarrera, c.nomCarrera, e.nroMatriculados

from #estudiantesSemestre e left outer join carreraProfesional c on e.codCarrera=c.codCarrera order by e.semestre, e.codCarrera --Relacion de asignaturas que tenga matriculados menos de 7 --estudiantes,en el ultimo semestre con el objetivo de eliminar el --dictado de dichas asignaturas en el semestre select max(semestre)ultimoSemestre into #ultimoSemestre from matricula select m.* into #ultimoMatricula from matricula m right outer join #ultimoSemestre u on m.semestre=u.ultimoSemestre select semestre, codAsignatura, count(codEstudiante) nroEstudiante into #asignaturaEstudiantes from #ultimoMatricula group by semestre, codAsignatura having count(codEstudiante)<7 select e.semestre, e.codAsignatura, a.denominacion, e.nroEstudiante from #asignaturaEstudiantes e left outer join asignatura a on e.codAsignatura=a.codAsignatura --Relacion de estudiantes matriculados en el ultimo semestre en --asignaturas con menos de 7 estudiantes select max(semestre)ultimoSemestre into #ultimoSemestre from matricula select m.* into #ultimoMatricula from matricula m inner join #ultimoSemestre u on m.semestre=u.ultimoSemestre select semestre, codAsignatura, count(codEstudiante) nroEstudiante into #asignaturaEstudiantes from #ultimoMatricula group by semestre, codAsignatura having count(codEstudiante)<7 select a.semestre, a.codAsignatura, m.codEstudiante into #asignaturaAnulada from #asignaturaEstudiantes a left outer join matricula m on a.codAsignatura=m.codAsignatura where a.semestre=m.semestre select a.semestre, a.codAsignatura, b.denominacion, a.codEstudiante into #asignaturaDenominacion from #asignaturaAnulada a left outer join asignatura b on a.codAsignatura=b.codAsignatura select a.*, e.apPaterno, e.apMaterno, e.nombres, e.codCarrera from #asignaturaDenominacion a left outer join estudiante e on a.codEstudiante=e.codEstudiante order by a.codEstudiante --Asignatura de categoria categoria OE, EE en las cuales en el ultimo semestre se matricularon mas de 50 estudiantes (con el objetivo de crear dos grupos) select *

into #asignaturaEspecialidad from asignatura where categoria in('OE','EE') declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula select m.semestre, a.codAsignatura, a.denominacion, a.categoria, count(codEstudiante) nroMatriculados from #asignaturaEspecialidad a left outer join matricula m on a.codAsignatura=m.codAsignatura where m.semestre=@ultimoSemestre group by m.semestre, a.codAsignatura, a.denominacion, a.categoria having count(codEstudiante)>50 --Relacion de carrera profesionales con menos de 10 estudiantes --ingresantes en el ultimo semestre declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula select c.codCarrera, c.nomCarrera, count(codEstudiante) nroEstudiantes from carreraProfesional c left outer join estudiante e on c.codCarrera=e.codCarrera where e.semestre=@ultimoSemestre group by c.codCarrera, c.nomCarrera having count(codEstudiante)<10

3. Consultas Avanzadas: Sub consultas: Es una instruccin select anidada dentro de una instruccin select, select..into, insert..into, delete, update o tambin dentro de otra consulta Un inconveniente de este tipo de consultas es que el uso de grandes anidamientos de sub consultas o incluso de subconsultas sencillas pueden afectar el rendimiento por lo cual no es recomendable el uso de esta estructura SELECT columnas seleccionadas FROM tablas WHERE columnas= [ANY/ALL/SOME/IN/NOT IN/EXISTS/ NOT EXISTS] (SELECT campo/campos FROM tablas WHERE condicin) Descripcin: Son utilizadas a continuacin de la sentencia WHERE, se usa para condicionar o restringir la informacin que retornara la consulta principal. Para crear una subconsulta se puede hacer uso de distintos tipos de comparaciones Comparacin [ANY / ALL / SOME]: Es una expresin y un operador que compara la expresin con el resultado de la consulta. Se puede utilizar en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clausula WHERE o HAVING Se puede utilizar ANY o SOME, los

cuales son sinnimos, para recuperar registros de la consulta principal, que satisfagan la comparacin con cualquier otro registro recuperad El predicado ALL se utiliza para recuperar nicamente aquellos registros de la consulta principal que satisfacen la comparacin con todos os registros recuperados de la subconsulta

Ejemplos:
--Se necesita obtener toda la informacion de las asignaturas que hayan --sido dictadas en los semetres 2009-I y 2009-II select * from asignatura where codAsignatura= any(select codAsignatura from cargaAcademica where semestre='2009-I' or semestre='2010-I' ) --Se necesita seleccionar al estudiante cuya nota en la asignatura de --Teora General de Sistemas sea mayor a todos los estudiantes que --llevaron dicha asignatura select e.codEstudiante, e.apPaterno, e.apMaterno, e.Nombres, m.nota from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where m.codAsignatura='IIAA54' and m.nota> all (select nota from matricula where codAsignatura='IIAA54' ) --Relacion de estudiantes de la Carrera Profesional de Ing. de --Sistemas, que aun no hayan llevado la asignatura de Teora y Diseo --de Base de Datos II select * from estudiante where codEstudiante not in(select codEstudiante from matricula where codAsignatura='IIAA61'and codCarrera='SI' ) --Se desea obtener la informacion de las asignaturas dictadas en el --semestre 2010-I que tengan asignados docentes de --categoria contrado select a.codAsignatura, a.denominacion, a.credito, a.categoria from asignatura a inner join cargaAcademica c on a.codAsignatura=c.codAsignatura where semestre='2010-I' and c.codDocente in(select codDocente from docente where categoria='CO' ) --Recuperar los datos del estudiante con codigo de --matricula 1003520081siempre y cuando se haya matriculado --en el semestre 2010-I y haya aprobado por lo menos una --asignatura select *

from estudiante e where e.codEstudiante='1003520081' and exists(select codEstudiante from matricula where nota>10 and codEstudiante='1003520081' and semestre='2010-I' ) /*Sub consulta como tabla derivada Es un conjunto de registros dentro de una consulta que funciona como una tabla, es decir ocupa el lugar de la tabla en la clausula FROM. La sintaxis utilizada para este tipo de consulta es anidada SELECT t1.atributos, t2.atributos FROM tabla1 t1 [INNER JOIN/LEFT/(RIGTH) OUTER JOIN] (SELECT ...) as t2 */ /* Estudiantes que ingresaron en el semestre 2008-I a la carrera profesional de ingenieria de sistemas con el numero de creditos que estan llevando en el semestre 2010-I */ select e1.*, e2.nroCredito from estudiante e1 inner join (select codEstudiante, sum(credito) nroCredito from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where m.semestre='2010-I' group by codEstudiante ) e2 on e1.codEstudiante=e2.codEstudiante where e1.semestre='2008-I' /*Sub consulta como una expresion Si una consulta es evaluada como una expresion los resultados son considerados como atributos o campos adicionales en la consulta. La sintaxis utilizada para este tipo de consultas anidadas es SELECT t1.atributos, (SELECT ...) as campo1 FROM tabla1 t1 */ /* Estudiantes que ingresaron en el semestre 2008-I a la carrera profesional de sistemas con el numero de creditos que esten llevando en el semestre 2010-I */ select e.*, (select sum(a.credito) from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where m.semestre='2010-I' and m.codEstudiante=e.codEstudiante ) nroCredito from estudiante e where e.semestre='2008-I'

4. /*Consulta y Esquema Modular Cuando la necesidad de informacion requiere de una consulta avanzada dentro del SQL, el uso de "Modularidad", como un concepto que permite descomponer un problema en unidades logicas , hace que se optenga un codigo ordenado, eficiente y claro para resolver problemas, para esto se hace referencia a tablas temporales las cuales almacenarn la informacin resultante de una consulta (unidad logica)

Las tablas temporales son similares a las permanentes, excepto por el hecho de que las primeras son almacenadas en la Base de Datos tempdb de manera temporal y sn eliminados automticamente cuando ya no se hace uso de ellas Tablas temporales locales.- presenta un solo signo de nmero (#) como primer carcter del nombre; son visibles y estn disponibles nicamente para la conexin actual del usuario y se eliminan cuando el usuario se desconecta de los equipos en los que se ejecuta SQL Server Tablas temporales globales.- presenta dos signos de nmero (##) antes del nombre, son visibles y estn disponibles para cualquier usuario despus de su creacin y se eliminan cuando el usuario se desconecta de SQL Server

Sintaxis: SELECT atributos INTO #TEMPORAL, [##TEMPORAL] FROM nombreTabla WHERE condicin
/* Relacion de estudiantes de la CPIS que hayan aprobado todas las asignaturas en el semestre 2010-I */ --R(codEstudiante, apPaterno, apMaterno,Nombres) select e.codEstudiante, count(m.codAsignatura)nroAsignatura into #estudianteAsignaturas from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where e.codCarrera='SI' and m.semestre='2010-I' group by e.codEstudiante select e.codEstudiante, count(m.codAsignatura)nroAsigAprob into #estudianteAsigAprob from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where e.codCarrera='SI' and m.semestre='2010-I' and m.nota in ('11','12','13','14','15','16','17','18','19','20') group by e.codEstudiante select e.* from estudiante e where e.codCarrera='SI' and e.codEstudiante in (select a.codEstudiante from #estudianteAsignaturas a inner join #estudianteAsigAprob ap on a.codEstudiante=ap.codEstudiante where a.nroAsignatura=ap.nroAsigAprob )

5. Tablas Cruzadas Las solicitudes de informacion en las consultas con diversidad de campos requeridos, hacen que se necesite flexibilidad en el desarrollo, demandado

incluso girar los resultados generados en la consulta, vale decir ver una tabla de manera invertida Sintaxis: SELECT atributos, CASE exp1 WHEN exp2 THEN result1 ELSE result2 END FROM nombreTabla GROUP BY atributos
/* Se desea optener la informacion de la cantidad de estudiantes matriculados por curso entre los aos 2007 y 2010 a la CPIS */ --R(codAsignatura, a2007,a2008,a2009,a2010, denominacion) select m.semestre, m.codAsignatura, e.codEstudiante into #estudianteCurso from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where e.codCarrera='SI' select codAsignatura, a2007= sum(case substring(semestre,1,4) when '2007' then 1 else 0 end), a2008= sum(case when substring(semestre,1,4)='2008' then 1 else 0 end), a2009= sum(case substring(semestre,1,4) when '2009' then 1 else 0 end), a2010= sum(case substring(semestre,1,4) when '2010' then 1 else 0 end) into #tablaCruzada from #estudianteCurso group by codAsignatura select t.*, a.denominacion from #tablaCruzada t inner join asignatura a on t.codAsignatura=a.codAsignatura

/*Vista Actualizable El comportamiento de las vista similar al de las tablas, genera la necesidad de modificar, eliminar o insertar informacion, es por ello tambien que se cuenta con las vistas actualizables, la cual modifican la tabla fisica subyacentes a estas Las instrucciones DELETE, INSERT, UPDATE pueden hacer referencia a una vista siempre y cuando SQL server pueda convertir, sin problemas la ambiguedad. CREATE VIEW vw_nombreVista as SELECT atributos FROM table WHERE condicion WITH CHECK OPTION UPDATE vw_nombreVista SET nombreAtributo= valor DELETE FROM vw_nombreVista [WHERE condicion] INSET INTO vw_nombreVista VALUES(atributos)

WITH CHECK OPTION: Al especificar esta opcion de verificacion, se determina que para insertar o modificar la modificacion en la vista, se debe satidfacer el criterio especificado, si la informacion no cumple con este criterio, simplemente no se realiza dicha modificacin */ /* En la vista vw_cpis creada en el ejemplo anterior, se desea agregar nuevos estudiantes ingresante a la carrera */ insert into vw_cpis values('1000220085','Villena','Alcca','Luis','2010-I','SI') CATORCEAVA PARTE use BDControlAcademico go /* El coordinador de la carrera profesional de ingenieria de sistemas con el objetivo de planificar el numero de grupos por asignatura para el proximo semestre, requiere la cantidad de estudiantes aprobados por asignatura en el ultimo semestre */ --R(codAsignatura,denomiancion,categoria,nroAprobados) declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula select M.* into #estudianteAprobados from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where m.semestre=@ultimoSemestre and e.codCarrera='SI' and cast((case when nota='NSP' then '0' else m.nota end) as int)>10 select e.codAsignatura, a.denominacion, a.categoria, count(e.codEstudiante)nroAprobados from #estudianteAprobados e inner join asignatura a on e.codAsignatura=a.codAsignatura group by e.codAsignatura, a.denominacion,a.categoria /* Segun el reglamento de la universidad, los estudiantes que deseen hacer practicas pre profesionales deben cumplir el requisito de tener una cantidad minima de creditos, para lo cual el coordinador de la CPIS desea tener la relacion de los estudiantes con su respectivo numero de creditos aprobados */ --R(codEstudiante,apPaterno,apMaterno,nombres,credAprobado) select distinct e.codEstudiante,e.apPaterno,e.apMaterno,e.nombres, m.codAsignatura,m.nota into #cursoAprobado from matricula m inner join estudiante e on m.codEstudiante=e.codEstudiante where e.codCarrera='SI' and cast((case when m.nota='NSP' then '0' else m.nota end) as int)>10 select c.codEstudiante, c.apPaterno, c.apmaterno, c.nombres, sum(a.credito) credAprobado from #cursoAprobado c inner join asignatura a on c.codAsignatura=a.codAsignatura

group by c.codEstudiante, c.apPaterno, c.apmaterno, c.nombres --Relacion de estudiantes que hayan aprobado todas sus asignaturas en todos los semestres select codEstudiante, count(codAsignatura) nroAsigMatriculada into #matriculado from matricula group by codEstudiante select codEstudiante, count(codAsignatura) nroAsigAprobada into #aprobado from matricula where cast((case when nota='NSP' then '0' else nota end)as int)>10 group by codEstudiante select * from estudiante where codEstudiante in (select m.codEstudiante from #matriculado m inner join #aprobado a on m.codEstudiante=a.codEstudiante where m.nroAsigMatriculada=a.nroAsigAprobada ) /* Los estudiante que optubieron promedio ponderado en el ultimo semestre pueden llevar mas de 22 creditos en el proximo semestre. Determinar la relacion de estudiantes que optubieron un promedio ponderado */ declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula select m.codEstudiante, promPonderado= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(15,6))*a.credito)/ sum(a.credito) into #promedio from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where m.semestre=@ultimoSemestre group by m.codEstudiante select e.*, p.promPonderado from estudiante e inner join #promedio p on e.codEstudiante=p.codEstudiante where p.promPonderado>=13 /* El area de servicios academicos, desea optener la relacion de carreras profesionales con la cantidad de estudiantes con promedio ponderado en los dos ultimo semestres */ --R(codCarrera,codEstudiante,apPaterno,apMaterno,nombres, --nroSemestre) declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula declare @penultimoSemestre varchar(7) select @penultimoSemestre= max(semestre)

from matricula where semestre<>@ultimoSemestre select m.semestre,m.codEstudiante, promPonderado= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(15,6))*a.credito)/ sum(a.credito) into #estudiantePonderado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura group by m.semestre,m.codEstudiante having semestre in(@ultimoSemestre,@penultimoSemestre) and sum(cast((case when nota='NSP' then '0' else nota end)as numeric(15,6))*a.credito)/ sum(a.credito)>=13 select e.codCarrera,p.codEstudiante,e.apPaterno,e.apmaterno, e.Nombres, count(p.semestre) nroSemestre from #estudiantePonderado p inner join estudiante e on p.codEstudiante=e.codEstudiante group by e.codCarrera,p.codEstudiante,e.apPaterno,e.apmaterno, e.Nombres having count(p.semestre)=2 /* La universidad realiza convenios de intercambio con estudiantes de universidades del exterior, para lo cual, se requiere la relacion de estudiantes aptos para postular a una vacante de intercambio. Se considera un postulante apto al que optubo promedio ponderado en todos los semestres de su estudio universitario */ --R(codEstudiante,apPaterno,apMaterno,nombres,semestre, --codCarrera) select m.semestre, m.codEstudiante, promPonderado= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(15,6))*a.credito)/ sum(a.credito) into #promediosPonderado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura group by m.semestre, m.codEstudiante select codEstudiante, count(semestre) nroSemPonderado into #semestrePonderado from #promediosPonderado where promPonderado>=13 group by codEstudiante select codEstudiante, count(distinct semestre) nroSemestre into #semestreMatriculado from matricula group by codEstudiante select * from estudiante where codEstudiante in (select p.codEstudiante from #semestrePonderado p inner join

#semestreMatriculado m on p.codEstudiante=m.codEstudiante where nroSemPonderado=nroSemestre) --Relacion de estudiantes que hayan aprobado todas las asignaturas en algun semestre select semestre, codEstudiante, count(codAsignatura)nroCursoSemestre into #cursoSemestre from matricula group by semestre, codEstudiante select semestre, codEstudiante, count(codAsignatura)nroCursoAprobado into #cursoAprobado from matricula where cast((case when nota='NSP' then '0' else nota end)as int)>10 group by semestre, codEstudiante select e.* from estudiante e where codEstudiante in (select distinct s.codEstudiante from #cursoSemestre s inner join #cursoAprobado a on s.semestre=a.semestre and s.codEstudiante=a.codEstudiante ) /* El coordinador de la carrera profesional de ingenieria de sistemas, desea optener la relacion de las asignaturas que tenga mas del 70% de desaprobados con el objetivo de considerar la posibilidad de tomar un nuevo examen */ --R(codAsignatura,denominacion,categoria,credito,codCarrera, --porcReprobado) declare @ultimosemestre varchar(7) select @ultimosemestre= max(semestre)from matricula select codAsignatura, count(codEstudiante)nroMatriculados, nroReprobados= sum(case when (case when nota='NSP' then 0 else cast(nota as int)end)<7 then 1 else 0 end) into #reprobados from matricula where semestre=@ultimosemestre group by codAsignatura select a.*, round(100*nroReprobados/nroMatriculados,2) porcReprobado from #reprobados r inner join asignatura a on r.codAsignatura=a.codAsignatura where (nroReprobados/nroMatriculados)*100>70 /* El area de proyeccion social de la universidad con el objetivo de brindar mejor orientacion e impulsar el mejor desempeo de sus, estudiantes, desea obtener la relacion de los estudiantes que hayan

desaprobado mas de tres veces una asignatura */ --R(codEstudiante,apPaterno,apMaterno,nombres,codAsignatura, --nroVeces) select codEstudiante, codAsignatura, count(nota) nroVeces into #nroVecesDesaprobado from matricula where (case when nota='NSP' then 0 else cast(nota as int) end)<11 group by codEstudiante,codAsignatura select e.*, d.codAsignatura, d.nroveces from #nroVecesDesaprobado d inner join estudiante e on d.codEstudiante=e.codEstudiante where d.nroVeces>3 /* Las autoridades universitarias, con el objetivo de evaluar la acogida de las carreras profesionales en los estudiantes, desean obtener la informacin de la evolucion del numero de ingresante por carrera profesional en los siguientes aos */ --R(codCarrera,nomCarrera,a2010,a2009,a2008) select codCarrera, a2010= sum(case when substring(semestre,1,4)='2010' then 1 else 0 end), a2009= sum(case when substring(semestre,1,4)='2009' then 1 else 0 end), a2008= sum(case when substring(semestre,1,4)='2008' then 1 else 0 end) into #evolucion from estudiante group by codCarrera select e.codCarrera, c.nomCarrera,a2010,a2009,a2008 from #evolucion e inner join carreraProfesional c on e.codCarrera=c.codCarrera /* Las autoridades universitarias, con el objetivo de evaluar la acogida de las carreras profesionales en los estudiantes, desean optener la informacion de la evolucion del numero de ingresantes por carreras profesionales en los ultimos 5 aos */ select distinct top 5 substring(semestre,1,4) anio into #5_ultimosAnios from matricula order by substring(semestre,1,4)asc declare @anio1 varchar(4) declare @anio2 varchar(4) declare @anio3 varchar(4) declare @anio4 varchar(4) declare @anio5 varchar(4) select @anio1= min(anio) from #5_ultimosAnios select @anio2= min(anio) from #5_ultimosAnios where anio<>@anio1 select @anio3= min(anio) from #5_ultimosAnios where anio not in(@anio1,@anio2)

select @anio4= min(anio) from #5_ultimosAnios where anio not in(@anio1,@anio2,@anio3) select @anio5= min(anio) from #5_ultimosAnios where anio not in (@anio1,@anio2,@anio3,@anio4) select e.codCarrera, anio1= sum(case when u.anio=@anio1 then 1 else 0 end), anio2=sum(case when u.anio=@anio2 then 1 else 0 end), anio3=sum(case when u.anio=@anio3 then 1 else 0 end), anio4=sum(case when u.anio=@anio4 then 1 else 0 end), anio5=sum(case when u.anio=@anio5 then 1 else 0 end) into #evolucionCruzada from estudiante e inner join #5_ultimosAnios u on substring(e.semestre,1,4)=u.anio group by codCarrera order by codCarrera select e.codCarrera, c.nomCarrera,e.anio1,e.anio2,e.anio3,e.anio4,e.anio5 from #evolucionCruzada e inner join carreraProfesional c on e.codCarrera=c.codCarrera /* Un estudiante se considera como egresado de la carrera profesional, si ha acumulado OCG 11 ECG 06 ACT 01 OFG 59 OE 95 EE 32 SEM 03 PPP 03 Determinar la relacion de egresados de la CPIS */ select e.codEstudiante, apPaterno, apMaterno, nombres, codAsignatura, nota into #matricula from estudiante e inner join matricula m on e.codEstudiante=m.codEstudiante where e.codCarrera='SI' select m.*, categoria, credito into #aprobados from #matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where (case when nota <>'NSP' then cast(nota as int) else 0 end)>10 select codEstudiante, apPaterno, apMaterno, nombres, OCG= sum(case when categoria='OCG' then credito else 0 end), ECG= sum(case when categoria='ECG' then credito else 0 end), ACT= sum(case when categoria='ACT' then credito else 0 end), OFG= sum(case when categoria='OFG' then credito else 0 end),

OE= sum(case when categoria='OE' then credito else 0 end), EE= sum(case when categoria='EE' then credito else 0 end), SEM= sum(case when categoria='SEM' then credito else 0 end), PPP= sum(case when categoria='PPP' then credito else 0 end) into #totalCredito from #aprobados group by codEstudiante, apPaterno, apMaterno, nombres select t.*, totalCredito= (OCG+ECG+ACT+OFG+OE+EE+SEM+PPP) from #totalCredito t where (OCG>=11)and(ECG>=6)and(ACT>=1)and(OFG>=59)and (OE>=95)and(EE>=32)and(SEM>=3)and(PPP>=3) /* Se desea tener la relacion de estudiantes que puedan ser considerados posibles candidatos al tercio estudiantil o al centro federado de la CPIS. Para lo cual se debe considerar aquellos que hayan aprobado todas sus asignaturas en los dos ultimo semestres */ declare @ultimoSemestre varchar(7) declare @penultimoSemestre varchar(7) select @ltimoSemestre=max(semestre)from matricula select @penultimoSemestre=max(semestre)from matricula where semestre<>@ultimoSemestre select codEstudiante, nroSem=count(distinct semestre) into #matriculaDos from matricula where semestre in(@ultimoSemestre,@penultimoSemestre) group by codEstudiante having count(distinct semestre)=2 select m.codEstudiante, nroMatriculados=count(codAsignatura), nroAprobados= sum(case when(case when nota='NSP' then 0 else cast(nota as int)end)>10 then 1 else 0 end) into #matriculadoAprobado from matricula m inner join #matriculaDos d on m.codEstudiante=d.codEstudiante where semestre in(@ultimoSemestre,@penultimoSemestre) group by m.codEstudiante select e.* from #matriculadoAprobado m inner join estudiante e on m.codEstudiante=e.codEstudiante where nroMatriculados=nroAprobados /* Las empresas a nivel nacional, crean plazas de practicas a los mejores estudiantes, para lo cual se considera mejor estudiante a quienes hayan optenido el promedio ponderado mas alto en su carrera

profesional. En esta oportunidad la universidad otorgara dos becas por carrera profesional, por lo tanto desea tener la lista de los dos mejores estudiantes de cada carrera profesional en el ultimo semestre, si se tienen promedio iguales en los dos primeros lugares la seleccion ha de hacerse por orden alfabetico */ declare @ultimoSemestre varchar(7) select @ultimoSemestre=max(semestre)from matricula select codEstudiante, promedio= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(5,2))*credito)/sum(credito) into #promPonderado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where semestre=@ultimoSemestre group by codEstudiante select orden= 0, codCarrera, p.codEstudiante, apPaterno, apMaterno, nombres, promedio into #promCarrera from #promPonderado p inner join estudiante e on p.codEstudiante=e.codEstudiante order by codCarrera,promedio desc, apPaterno declare @orden int set @orden= 0 declare @codCarrera varchar(2) set @codCarrera= '' update #promCarrera set @orden= case when codCarrera=@codCarrera then @orden+1 else 1 end, orden=@orden, @codCarrera= codCarrera select orden, p.codCarrera, nomCarrera, codEstudiante, apPaterno, apMaterno, nombres, promedio from #promCarrera p inner join carreraProfesional c on p.codCarrera=c.codCarrera where orden<=2 /* Las empresas a nivel nacional, crean plazas de practicas a los mejores estudiantes, para lo cual se considera mejor estudiante a quienes hayan optenido el promedio ponderado mas alto en su carrera profesional. En esta oportunidad la universidad otorgara dos becas por carrera profesional, por lo tanto desea tener la lista de los dos mejores estudiantes de cada carrera profesional en el ultimo semestre, considerar empates */ declare @ultimoSemestre varchar(7) select @ultimoSemestre=max(semestre)from matricula select codEstudiante, promedio= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(5,2))*credito)/sum(credito) into #promPonderado from matricula m inner join asignatura a on

m.codAsignatura=a.codAsignatura where semestre=@ultimoSemestre group by codEstudiante select orden= 0, codCarrera, p.codEstudiante, apPaterno, apMaterno, nombres, promedio into #promCarrera from #promPonderado p inner join estudiante e on p.codEstudiante=e.codEstudiante order by codCarrera,promedio desc, apPaterno declare @orden int set @orden= 0 declare @codCarrera varchar(2) set @codCarrera= '' declare @nota int update #promCarrera set @orden= case when codCarrera<>@codCarrera then 1 else (case when @orden=1 then @orden+1 else (case when @nota=promedio then @orden else @orden+1 end)end) end, orden=@orden, @codCarrera= codCarrera, @nota= promedio select codCarrera, codEstudiante, apPaterno, apMaterno, nombres, promedio from #promCarrera where orden<=2 order by codCarrera, promedio desc, apPaterno /* La universidad otorga becas a una cierta cantidad de becas a los mejores estudiantes de la universidad. Se considera mejor estudiante a aquellos con el promedio ponderado mas alto. La universidad otorga tres becas a los mejores estudiantes en el ultimo semestre, por lo tanto se necesita la informacion de aquellos que acceden a estas becas */ declare @ultimoSemestre varchar(7) select @ultimoSemestre=max(semestre)from matricula select codEstudiante, promedio= sum(cast((case when nota='NSP' then '0' else nota end)as numeric(5,2))*credito)/ sum(credito) into #promPonderado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where semestre=@ultimoSemestre group by codEstudiante select top 3 with ties p.codEstudiante, apPaterno, apMaterno, nombres, codCarrera, promedio from #promPonderado p inner join estudiante e on p.codEstudiante=e.codEstudiante order by promedio desc

/* De acuerdo a la desicion tomada por la autoridad universitaria, las carreras profesionales con menor numero de ingresantes, seran consideradas candidatas a congelar sus matriculas por un semestre, por lo tanto se desea determinar las tres carreras profeionales que cumplan con esta caracteristica en el ultimo ao. Considerar empates */ declare @ultSemestre varchar(7) select @ultSemestre=max(semestre)from matricula declare @penultSemestre varchar(7) select @penultSemestre=max(semestre)from matricula where semestre<>@ultSemestre select codCarrera, penultSem= sum(case when semestre=@penultSemestre then 1 else 0 end), ultSem= sum(case when semestre=@ultSemestre then 1 else 0 end) into #ingresante from estudiante group by codCarrera select top 3 with ties i.codCarrera, nomCarrera, sum(penultSem+ultSem) ultimoAnio from #ingresante i inner join carreraProfesional c on i.codCarrera=c.codCarrera group by i.codCarrera, nomCarrera order by ultimoAnio asc /* Se desea evaluar el rendimiento de los docentes en las asignaturas, y para poder hacerlo, el jefe de departamento academico requiere la relacion de asignaturas de la CPIS que en los ultimos cinco semestre el numero de aprobados fue menos del 50% */ select distinct top 5 semestre into #5_ultimoSem from matricula order by semestre desc select m.* into #matricula from #5_ultimoSem u inner join matricula m on u.semestre=m.semestre select semestre, m.codAsignatura,a.denominacion, count(codEstudiante) nroMatriculado, nroAprobado= sum(case when (case when nota='NSP' then 0 else cast(nota as int)end)>10 then 1 else 0 end) into #matriculadoAprobado from #matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where a.codCarrera='SI' group by semestre, m.codAsignatura, a.denominacion select m.*, c.codDocente, porcentaje= round(100*cast(nroAprobado as

numeric(5,2))/cast(nromatriculado as numeric(5,2)),4) into #porcentaje from #matriculadoAprobado m inner join cargaAcademica c on m.semestre=c.semestre and m.codAsignatura=c.codAsignatura select codAsignatura, , denominacion, count(semestre)nroSemestre from #porcentaje where porcentaje<50 group by codAsignatura /* La universidad desea tener la relacion de carreras profesionales cuyo numero de ingresante haya disminuido de semestre a semestre en los ultimo tres semestres, con el objetivo de evaluar la postergacion de ingresos a las carreras profesionales con una evolucion descendente de numero de ingresantes */ declare @sem1 varchar(7) select @sem1=max(semestre)from matricula declare @sem2 varchar(7) select @sem2=max(semestre)from matricula where semestre<>@sem1 declare @sem3 varchar(7) select @sem3=max(semestre)from matricula where semestre not in(@sem2,@sem3) select codCarrera, ingSem1= sum(case when semestre=@sem1 then 1 else 0 end), ingSem2= sum(case when semestre=@sem2 then 1 else 0 end), ingSem3= sum(case when semestre=@sem3 then 1 else 0 end) into #ingresanteTres from estudiante where semestre in(@sem1,@sem2,@sem3) group by codCarrera select t.codCarrera, c.nomCarrera, ingSem1, ingSem2, ingSem3 from #ingresanteTres t inner join carreraProfesional c on t.codCarrera=c.codCarrera where ingSem3<ingSem2 and ingSem2<ingSem1 QUINCEAVA PARTE use BDControlAcademico go /*Cursores El objetivo de este capitulo es brindar un medio alternativo de solucin a consultas que no pueden ser ejecutadas de manera mas optima que con el recorrido secuencial de los datos, realizando operaciones en cada paso del recorrido. definicion.- Una bas ede datos tiene operaciones que actuan sobre un conjunto de filas, como por ejemplo SELECT que retorna la informacion solicitada en funcion de una clausula WHERE que

determina la condicion que cumple ese conjunto de datos, in embargo las consultas realizadas a la base de datos, no siempre requieren el trabajar con el conjunto de resultados. Es por ello que estas consultas necesitan de un mecanismo que trabaje o acceda a una sola fila a la vez. Un cursor es un mecanismo requerido el cual permite recorrer fila a fila las tuplas de una tabla o consulta existente. Es recomendable que los cursores sea utlizado como ultimo recurso luego de agotar todas las posibilidades alternas para la generacion de las consultas, en vista que son consumidores descomunales de recursos del servidor. Tipos de cursores cursores desplazables.- Un cursor desplazable es aquel que permite la colocacin en cualquier fila del conjuntode resultado. Estos metodos de reubicacion consumen demasiados recursos del sistema. Por lo tanto se aconseja limitar los cursores y seleccionar los no desplazables cursores de avance.- Este tipo de cursor solo permite utilizar los metodos para despalzarce avanzando por filas del conjunto de resultados, no permiten el retroceso por las mismas cursores estaticos.- Un cursor estatico proporciona la capasidad de direccionar por todo el conjunto de resultados generando una copia en la estacion de trabajo de las filas, devueltas, todos los trabajos realizados sobre este conjunto de resultados afectara unicamente a la copia local. cursores de conjunto de claves.- Un cursor de conjunto de claves, almacena un conjunto de claves, basicamente un conjunto de punteros, y permite volver a capturar una fila seleccionada de acuerdo con la informacion epecifica de la fila almacenada en dichas claves cursores dinamicos.- Un cursor dinamico almacena un bloque de claves. Sin embargo, con este tipo de cursor, la consulta que se ha utilizado para generar el conjunto de resultados se vuelve a ejecutar constantemente siempre que se hace referencia al cursor cursor de solo lectura.- Todos los tipos de cursores citados admiten la posibilidad de solo lectura, en este caso ninguna de las filas del conjunto de resultados pueden ser modificadas por la estacion de trabajo. Es muy util para la generacion de consultas donde ningun dato sera modificado Sintaxis DECLARE nombreCursor [SCROLL] CURSOR FOR especificacion-consulta(SELECT) OPEN nombreCursor FECTH NEXT FROM nombreCursor INTO listaVariable WHILE @@fetch_Status=0 begin Intrucciones que proceden acda fila ... FECTH NEXT FROM nombreCursor

INTO @variable1, @variable2, ... end; CLOSE nombreCursor DEALLOCATE nombreCursor La clausula SCROLL, es opcional y especifica que estan disponicles todas las opciones de recuperacion (FIRST, LAST, PRIOR, NEXT, RELATIVE APSOLUTE) La variable @@FETCH_STATUS puede tener los siguientes valores dependiendo del resultado de la consulta valor 0: si la instruccion FECTH se ejecuto correctamente valor 1: si la instruccion FECTH ha finalizado con error o la fila estaba mas all del conjunto de resultados valor 2: falta la fila recuperada FECTH NEXT devuelve la fila de resultados que le siguen inmediatamente a la fila actual y la fila devuelta pasa a ser fila actual INTO @variables, permite que los datos de la columna de una busqueda pasen a variables locales. El tipo de datos de cada variable tiene que ser compatible con el tipo de dato de la columna correspondiente del conjunto de resultados y el numero de variables tiene que coincidir con el numero de columnas de la lista seleccionada en el cursor Los comandos OPEN, CLOSE; permiten aparecer y desaparecer el cursor sobre el registro actual DEALLOCATE quita uan referencia a un cursor, libera las estructuras de datos que componen el cursor DROP CURSOR nombreCursor; si la ocasion lo amerita se puede eliminar el cursor */ /* Se desea conocer el rendimiento por semestre de un estudiante por lo tanto se requiere la relacion de creditos aprobados y acumulados semestre por semestre, para un determinado estudiante. La relacion resultante, debe tener la siguiente estructura */ --R(semestre,nroAsigAprobado,credAprobado,credAcumulado) --Elaboramos la tabla temporal con las asignaturas aprobadas select m.*, a.credito into #asigAprobada from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where codEstudiante='1003520081' and cast((case when nota<>'NSP' then nota else '0' end) as int)>10 --Elaboramos tabla con el numero de asignaturas aprobadas y suma de --creditos por semestre select semestre, count(codAsignatura) nroAsigAprobado, sum(credito) credAprobado, 0 credAcumulado into #credAcumulado from #asigAprobada group by semestre

order by semestre --declaramos variables declare @semestre varchar(7), @nroAsigAprob int, @credAprob int, @credAcum int, @codEstudiante varchar(11), @credAcumAux int --declaramos el cursor declare creditoAcumulado cursor for select semestre, nroAsigAprobado, credAprobado, credAcumulado from #credAcumulado order by semestre --abrimos el cursor set @credAcumAux= 0 open creditoAcumulado fetch NEXT from creditoAcumulado into @semestre, @nroAsigAprob, @credAprob, @credAcu m while @@fetch_status= 0 begin set @credAcumAux= @credAcumAux+@credAprob --Actualizamos los creditos acumulados update #credAcumulado set credAcumulado= @credAcumAux where semestre= @semestre --Asignamos el siguiente registro a la variable fetch NEXT from creditoAcumulado into @semestre, @nroAsigAprob, @credAprob, @credAcum end close creditoAcumulado deallocate creditoAcumulado select * from #credAcumulado /* La universidad desea tener la relacion de carreras profesionales cuyo numero de ingresantes haya disminuido de semestre a semestre en los ultimo tres semestres, con el objetivo de evaluar la postergacion de ingersos a las carreras profesionales con una evoluaiocn descendente de numero de ingresantes */ --Seleccionar los tres ultimos semestres declare @ultSemestre varchar(7) declare @penultSemestre varchar(7) declare @antepenultSemestre varchar(7) select @ultSemestre= max(semestre) from estudiante select @penultSemestre= max(semestre) from estudiante where semestre<>@ultSemestre select @antepenultSemestre= max(semestre) from estudiante where semestre not in(@ultSemestre,@penultSemestre) --Declarar variables a ser usadas en el cursor declare @codCarrera varchar(2), @semestre varchar(7),

@codEstudiante varchar(11),@codCarreraAux varchar(2), @semestre1Aux int, @semestre2Aux int, @semestre3Aux int --Se crea la tabla temporal con todas las carreras profesionales --existentes select codCarrera, nomCarrera, 0 semestre1, 0 semestre2, 0 semestre3 into #ingresantes from carreraProfesional declare ingresanteCarrera cursor for select codCarrera, semestre, codEstudiante from estudiante where semestre in(@ultSemestre, @penultSemestre, @antepenultSemestre) order by codCarrera, semestre --Se abre el cursor y se asigna el primer registro en las varibles ya --declaradas set @codCarreraAux= '' open ingresanteCarrera fetch NEXT from ingresanteCarrera into @codCarrera, @semestre, @codEstudiante while @@fetch_status= 0 begin if(@codCarrera<>@codCarreraAux) begin set @semestre1Aux= 0 set @semestre2Aux= 0 set @semestre3Aux= 0 end if @semestre=@ultSemestre set @semestre1Aux= @semestre1Aux+1 if @semestre=@penultSemestre set @semestre2Aux= @semestre2Aux+1 if @semestre=@antepenultSemestre set @semestre3Aux= @semestre3Aux+1 update #ingresantes set semestre1=@semestre1Aux, semestre2=@semestre2Aux, semestre3=@semestre3Aux where codCarrera=@codCarrera --Actualizamos codCarreraAux para comprobar con el siguiente --registro set @codCarreraAux= @codCarrera fetch NEXT from ingresanteCarrera --Apuntamos a la siguiente tupla into @codCarrera, @semestre, @codEstudiante end close ingresanteCarrera

deallocate ingresanteCarrera select * from #ingresantes /* Se desea tener el rendimiento anual de cada estudiante de la universidad por lo tanto se requiere la relacion de creditos aprobados y acumulados ao a ao, para cada estudiante. La relacion resultante, debe tener la estructura siguiente */ --R(codEstudiante, ao, nroAsigAprobado, credAprobado, --credAcumulado) --tabla temporal con el nroAsigAprobado, credAprobado y --creAcumulado select codEstudiante, substring(semestre,1,4) as anio, count(m.codAsignatura) nroAsigAprobado, sum(credito) credAprobado, 0 credAcumulado into #credAcumulado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where cast((case when nota='NSP' then '0' else nota end)as int)>10 group by codEstudiante, substring(semestre,1,4) order by codEstudiante, substring(semestre,1,4) --declaramos variables declare @codEstudiante varchar(11), @anio varchar(4), @nroAsigAprobado int,@credAprobado int, @credAcumulado int, @codEstudianteAux varchar(11), @credAcumuladoAux int --declaramos el cursor declare creditoAcumulado cursor for select codEstudiante, anio, nroAsigAprobado, credAprobado, credAcumulado from #credAcumulado order by codEstudiante, anio --abrimos cursor set @codEstudianteAux= '' open creditoAcumulado fetch NEXT from creditoAcumulado into @codEstudiante,@anio,@nroAsigAprobado, @credAprobado,@credAcumulado while @@fetch_status= 0 begin --Si cambia el codigo del estudiante, se inicializa los credAcumulados if(@codEstudiante<>@codEstudianteAux) set @credAcumuladoAux= 0 --actualizamos el creditaje set @credAcumuladoAux= @credAcumuladoAux+@credAprobado --actualizamos el creditaje update #credAcumulado set credAcumulado= @credAcumuladoAux where codEstudiante=@codEstudiante and anio=@anio

--almacenamos codigo del estudiante set @codEstudianteAux= @codEstudiante --se asigna el siguiente registro a las variables fetch NEXT from creditoAcumulado into @codEstudiante,@anio,@nroAsigAprobado, @credAprobado,@credAcumulado end close creditoAcumulado deallocate creditoAcumulado /* Con el objetivo de evaluar el mercado laboral en el area de sistemas. Se desea tener la informacion de la cantidad de estudiantes egresados de la carrera profesional, semestre por semestre, asi como el numero de acumulados de estudiantes egresados en cada semestre. */ --R(semestre, nroEgresados,acumEgresado) select m.codEstudiante, m.semestre, codAsignatura into #aprobado from matricula m inner join estudiante e on e.codEstudiante=m.codEstudiante where e.codCarrera='SI' and (case when nota='NSP' then 0 else cast(nota as int) end)>10 select codEstudiante, ultSemestre=max(semestre), AC=sum(case when categoria='AC' then credito else 0 end), ECG= sum(case when categoria='ECG' then credito else 0 end), EE=sum(case when categoria='EE' then credito else 0 end), OCG= sum(case when categoria='OCG' then credito else 0 end), OE=sum(case when categoria='OE' then credito else 0 end), SEM= sum(case when categoria='SEM' then credito else 0 end), PPP= sum(case when categoria='PPP' then credito else 0 end) into #categoria from #aprobado p inner join asignatura a on a.codAsignatura=p.codAsignatura group by codEstudiante select ultSemestre, count(codEstudiante) nroEgresado, 0 acumEgresado into #egresado from #categoria where AC>=1 and ECG>=7 and EE>=31 and OCG>=11 and OE>=154 and SEM>=3 and PPP>=3 group by ultSemestre order by ultSemestre desc --declaramos variables declare @semestre varchar(7),@nroEgresados int, @acumEgresado int, @acumEgresadoAux int

--declaramos cursor declare egresadoSI cursor for select * from #egresado order by ultSemestre --abrimos el cursor open egresadoSI fetch NEXT from egresadoSI into @semestre,@nroEgresados,@acumEgresado set @acumEgresadoAux= 0 while @@fetch_status= 0 begin --Acumulamos el numero de egresados set @acumEgresadoAux= @acumEgresadoAux+@nroEgresados --actualizamos la columna de acumulados update #egresado set acumEgresado= @acumEgresadoAux where ultSemestre=@semestre --siguiente variable fetch NEXT from egresadoSI into @semestre,@nroEgresados,@acumEgresado end close egresadoSI deallocate egresadoSI select * from #egresado /* Se desea determinar el indice de rendimiento de cada estudiante de ao a ao, considerando que el indice de rendimiento esta basado en la cantidad acumulada de creditos aprobados dividido entre la cantidad acumulada de creditos desaprobados. */ --R(ao,nroCredAprob,nroCredDesap,credAprobAcum, --credDesapAcum,indRendimiento) select codEstudiante, substring(semestre,1,4) anio, nota, credito into #matricula from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura select codEstudiante, anio, nroCredAprob= sum(case when(case when nota='NSP' then 0 else cast(nota as int)end)>10 then credito else 0 end), nroCredDesap= sum(case when(case when nota='NSP' then 0 else cast(nota as int)end)<11 then credito else 0 end), 0 credAprobAcum, 0 credDesapAcum, indRendimiento=cast(0 as numeric(5,3)) into #acumulados from #matricula group by codEStudiante, anio order by anio desc --declaramos variables declare @codEstudiante varchar(10), @anio varchar(4), @nroCredAprob int, @nroCredDesap int, @credAprobAcum int, @credDesapAcum int,

@indRendimiento numeric(5,3), @codEstudianteAux varchar(10) --inicializamos variables set @codEstudianteAux= '' set @credAprobAcum= 0 set @credDesapAcum= 0 set @indRendimiento= 0.00 --declaramos cursor declare indRendimiento cursor for select * from #acumulados --abrimos cursor open indRendimiento fetch NEXT from indRendimiento into @codEstudiante,@anio,@nroCredAprob,@nroCredDesap, @credAprobAcum, @credDesapAcum,@indRendimiento while @@fetch_status= 0 begin --inicializamos cada vez que cambia un estudiante if @codEstudiante<>@codEstudianteAux set @credAprobAcum= 0 set @credDesapAcum= 0 --calculamos nuevos acumulados set @credAprobAcum= @credAprobAcum+ @nroCredAprob set @credDesapAcum= @credDesapAcum+ @nroCredDesap set @indRendimiento= (case when @credDesapAcum=0 then 0 else (cast(@credAprobAcum as numeric(5,3))/ cast(@credDesapAcum as numeric(5,3))) end)*100 set @codEstudianteAux= @codEstudiante --modificamos la tabla auxiliar insert into #acumulados values(@codEstudiante,@anio,@nroCredAprob, @nroCredDesap,@credAprobAcum,@credDesapAcum, @indRendimiento) --siguiente fetch NEXT from indRendimiento into @codEstudiante,@anio,@nroCredAprob, @nroCredDesap,@credAprobAcum, @credDesapAcum,@indRendimiento end close indRendimiento deallocate indRendimiento select * from #acumulados /* Se necesita la relacion de carreras profesionales con el numero de estudiantes ingresantes semestre a semestre, con el porcentaje de incremento o decremento en numero de estudiantes respecto al semestre anterior. */ --R(codCarrera, semestre, nroIngresante, indice) select codCarrera, semestre, count(codEstudiante)nroIngresante,

indice= cast(0 as numeric(5,3)) into #ingresante from estudiante group by codCarrera, semestre order by codCarrera, semestre declare @codCarrera varchar(2), @semestre varchar(7), @nroIngresante int, @indice numeric(5,3), @codCarreraAux varchar(2), @nroIngresanteAux int --declaramos y abrimos el cursor declare indiceIngreso cursor for select * from #ingresante open indiceIngreso fetch NEXT from indiceIngreso into @codCarrera, @semestre, @nroIngresante, @indice set @codCarreraAux= '' set @nroIngresanteAux= 0 while @@fetch_status= 0 begin if @codCarreraAux<>@codCarrera set @nroIngresanteAux= 0 --calculamos los indices set @indice= case when @nroIngresanteAux=0 then 0 else 100*cast(@nroIngresante as numeric(5,3))/ cast(@nroIngresanteAux as numeric(5,3)) end set @nroIngresanteAux= @nroIngresante set @codCarreraAux= @codCarrera --actualizar el valor del indice update #ingresante set indice= @indice where codCarrera=@codCarrera and semestre=@semestre --siguiente registro a la variable fetch NEXT from indiceIngreso into @codCarrera,@semestre,@nroIngresante,@indice end close indiceIngreso deallocate indiceIngreso select * from #ingresante /* Se necesita la relacion de carreras profesionales con el numero de estudiantes ingresantes semestre a semestre, con el porcentaje de incremento o decremento en numero de estudiantes respecto al semestre anterior */ --R(carrera, semestre, nroIngresante, indice) select codCarrera, semestre, count(codEstudiante) nroIngresantes, indice=cast(0 as numeric(15,6)) into #ingresante from estudiante group by codCarrera, semestre order by codCarrera, semestre declare @codCarrera varchar(2), @semestre varchar(7), @nroIngresante int, @indice numeric(15,6),

@codCarreraAux varchar(2), @nroIngresanteAux int --declaramos cursor declare indiceIngreso cursor for select * from #ingresante --inicializamos variables set @codCarreraAux= '' set @nroIngresanteAux= 0 --abrimos cursor open indiceIngreso fetch from indiceIngreso into @codCarrera,@semestre,@nroIngresante,@indice while @@fetch_status= 0 begin if(@codCarreraAux<>@codCarrera) set @nroIngresanteAux= 0 set @indice= case when @nroIngresanteAux<>0 then (cast(@nroIngresante as numeric(15,6))/ cast(@nroIngresanteAux as numeric(15,6)))*100 else 0 end set @nroIngresanteAux= @nroIngresante set @codCarreraAux= @codCarrera --actualizar el valor del indice update #ingresante set indice=@indice where codCarrera=@codCarrera and semestre=@semestre --siguiente registro fetch from indiceIngreso into @codCarrera,@semestre,@nroIngresante,@indice end close indiceIngreso deallocate indiceIngreso select * from #ingresante /* Relacion de asignaturas de la Carrera Profesional de Ingenieria de Sistemas cuyo numero de matriculados haya disminuido de semestre a semestre en los ultimos cinco semestres */ select distinct top 5 semestre into #cincoUltimo from matricula order by semestre desc select m.* into #matriculaCinco from matricula m inner join #cincoUltimo c on m.semestre=c.semestre select m.codAsignatura, m.semestre, count(codEstudiante) matriculados into #asigInformatica from #matriculaCinco m inner join asignatura a on m.codAsignatura=a.codAsignatura where a.codCarrera='SI'

group by m.codAsignatura, m.semestre order by m.codAsignatura, m.semestre --creamos una tabla temporal la cual se almacenaran los codigos de la --asignatura create table #asigDecreciente(codAsignatura varchar(8)) --declaramos variables declare @codAsignatura varchar(8), @semestre varchar(7), @matriculados int,@codAsignaturaAux varchar(8), @nroMatriculadosAux int --declaramos cursor declare asigNoPopular cursor for select * from #asigInformatica --inicializamos variables set @codAsignaturaAux= '' set @nroMatriculadosAux= 0 --abrimos cursor open asigNoPopular fetch NEXT from asigNoPopular into @codAsignatura,@semestre,@matriculados while @@fetch_status=0 begin --si hubo un cambio de asignatura if @codAsignaturaAux<>@codAsignatura begin if @nroMatriculadosAux<>0 insert into #asigDecreciente values(@codAsignaturaAux) set @nroMatriculadosAux= @matriculados end else --se tiene el mismo valor de la asignatura if @matriculados>@nroMatriculadosAux set @nromatriculadosAux= 0 --se asigna el valor de cero si el nro de matriculados es mayor al --anterior registro set @codAsignaturaAux= @codAsignatura --siguiente registro las variables fetch NEXT from asigNoPopular into @codAsignatura,@semestre,@matriculados end close asigNoPopular deallocate asigNoPopular select a.* from #asigDecreciente d inner join asignatura a on d.codAsignatura=a.codAsignatura /* Las empresas a nivel nacional, crean plazas de practicas a los mejores estudiantes de cada carrera, para lo cual consideran mejor estudiante a aquienes hayan optenido el promedio ponderado mas alto de su carrera profesional. En esta oportunidad la universidad otorgara dos becas por carrera profesional, por lo tanto se desea tener la lista de

los dos mejorres estudiantes de cada carrera profesional en el ultimo semestre. Considerar empates */ declare @ultimoSem varchar(7) select @ultimoSem= max(semestre) from matricula --promedio ponderado de cada estudiantes el ltimo semestre select codEstudiante, promPonderado= sum((case when nota<>'NSP' then cast(nota as numeric(5,3)) else 0 end)*credito)/ cast(sum(credito) as numeric(5,3)) into #promPonderado from matricula m inner join asignatura a on m.codAsignatura=a.codAsignatura where semestre= @ultimoSem group by codEstudiante select puesto= 0, p.codEstudiante, apPaterno, apMaterno, nombres, codCarrera, promPonderado into #promCarrera from estudiante e inner join #promPonderado p on e.codEstudiante=p.codEstudiante order by codCarrera asc, promPonderado desc --declaramos variables declare @puesto int, @codEstudiante varchar(11), @codCarrera varchar(2), @promPonderado numeric(5,3), @puestoAux int, @puestoAnt int, @promPonderadoAux numeric(5,3), @codCarreraAux varchar(2), --inicalizamos variables set @puestoAnt= 1 set @promPonderadoAux= 0 set @codCarreraAux= '' --declaramos cursor declare puestoCP cursor for select puesto, codCarrera, codEstudiante, promPonderado from #promCarrera order by codCarrera, promPonderado desc --abrimos cursor open puestoCP fetch NEXT from puestoCP into @puesto,@codCarrera,@codEstudiante,@promPonderado while @@fetch_status= 0 begin --cambia la carrera el primer estudiante (primer puesto) if @codCarreraAux<>@codcarrera set @puestoAux= 1 else begin --si el promedio del estudiante es igual al del anterior if round(@promPonderadoAux,2)= round(@promPonderado,2) begin

if @puestoAnt=1 set @puestoAux= @puestoAnt+1 else set @puestoAux= @puestoAnt --se tiene empates en el primer puesto, se asignara el segundo --puesto a todos los empates generads. Si los dos empates se dan --en el segundo puesto los empates ocuparan el segundo puesto end else begin set @puestoAux= @puestoAnt+1 --Si se da un cambio de promedio, el estudiante ocupara un puesto --mas que el anterior end end --Una vez calculados los valores de las variables, se modifica en la --tabla de promedios el puesto que ubica el estudiante update #promCarrera set puesto= @puestoAux where codCarrera=@codCarrera and codEstudiante=@codEstudiante --inicializamos la variables set @codCarreraAux= @codCarrera set @promPonderadoAux= @promPonderado set @puestoAnt= @puestoAux --siguiente tupla fetch NEXT from puestoCP into @puesto,@codCarrera,@codEstudiante,@promPonderado end close puestoCP deallocate puestoCP select * from #promCarrera where puesto<=2 --En el examen de admision en la ultima etapa de calificacion, se tiene --las siguientes tablas notaPostulante(codPostulante, codCarrera, nota) --vacante(codCarrera, nroVacante)

También podría gustarte