Sei sulla pagina 1di 19

--Mostrar la suma y la cantidad de pedidos registrados por cada cliente. SELECT C.

Nombre_cliente 'CLIENTE', COUNT(*) AS 'CANTIDAD', SUM(Precio_por_unidad*CANTIDAD) AS 'SUMA' FROM Detalle_pedido PD JOIN PEDIDO PC ON PD.ID_pedido = PC.ID_pedido JOIN CLIENTE C ON C.Cod_cliente = PC.Cod_cliente GROUP BY C.Nombre_cliente ----------------------------------------------------------------------------------En el siguiente ejemplo, mostrar la cantidad de pedidos registrados por emplea do --en el ao 2013 y los empleados que no registraron pedidos en el 2013. SELECT e.Nombres, e.Apellidos, COUNT(*) AS 'CANTIDAD' FROM EMPLEADO E JOIN PEDIDO P ON e.Cod_empleado = P.Cod_empleado WHERE YEAR(P.Fecha_pedido)=2013 GROUP BY e.Nombres, e.Apellidos UNION SELECT e.Nombres, e.Apellidos, 0 AS CANTIDAD FROM EMPLEADO E WHERE e.Cod_empleado NOT IN(SELECT P.Cod_empleado FROM PEDIDO P WHERE YEAR(p.Fec ha_pedido)=2013) ----------------------------------------------------------------------------------------------Listar los clientes que hayan pedido mas de 3 veces un producto select Nombre_cliente, COUNT(p.ID_pedido) as cantidad from Cliente c inner join Pedido p on c.Cod_cliente=p.Cod_cliente group by c.Nombre_cliente having(COUNT(p.ID_pedido)>=3) ---------------------------------------------------------------------------------------------Listar los clientes que hayan pedido el mismo producto por 3 veces y que hayan realizado mas de 3 pedidos select Nombre_cliente,pr.Nombre_producto, COUNT(p.ID_pedido) as cantidad, COUNT(pr.Cod_producto) as [cantidad de productos] from Cliente c inner join Pedido p on c.Cod_cliente=p.Cod_cliente inner join Detalle_pedido d on p.ID_pedido=d.ID_pedido inner join Producto pr on pr.Cod_producto=d.Cod_producto group by c.Nombre_cliente, pr.Nombre_producto ----------------------------------------------------------------------------------------------- mostrar los productos que tengan el mayor y menor precio, visualice en ambos casos el nombre del producto. SELECT Nombre_producto, Precio FROM PRODUCTO WHERE Precio = (SELECT MAX(P.Precio) FROM PRODUCTO P) UNION SELECT Nombre_producto, Precio

FROM PRODUCTO WHERE Precio = (SELECT MIN(P.Precio) FROM PRODUCTO P) -----------------------------------------------------------------------------------------------transac -----------------------------------------------------------------------------------------------evaluar la existencia de un registro; si existe actualizamos los datos de la t abla; si no existe (ELSE) insertamos el registro. DECLARE @COPIAS VARCHAR(3), @NOMBRE VARCHAR(50) SET @COPIAS='111' SET @NOMBRE='EEEE' -- EVALUA SI EXISTE EL REGISTRO DE LA TABLA, SI EXISTE ACTUALIZO, SINO INSERTO IF EXISTS(SELECT * FROM PAIS WHERE ID_PAIS=@COPIAS ) BEGIN UPDATE PAIS SET NOMB_PAIS=@NOMBRE WHERE ID_PAIS=@COPIAS END ELSE BEGIN INSERT INTO PAIS VALUES(@COPIAS, @NOMBRE) END -- Comprobamos los resultados SELECT * FROM PAIS -----------------------------------------------------------------------------------------------Listar los 5 primeros registros de la tabla productos. DECLARE @CONTAR INT SET @CONTAR=1 WHILE @CONTAR <6 BEGIN SELECT ID_PRODUCTO,NOM_PRODUCTO,PRECIOxUNIDAD FROM PRODUCTO WHERE ID_PRODUCTO=@CONTAR SET @CONTAR+=1 END ---------------------------------------------------------------------------------------------Actualizar las unidades de existencia de los productos asignndoles el valor de 100 de --aquellos productos cuyo stock sea cero. DECLARE @ID INT, @NOMBRE VARCHAR(50) WHILE EXISTS(SELECT * FROM PRODUCTO WHERE STOCK=0) BEGIN SELECT @ID=ID_PRODUCTO, @NOMBRE=NOM_PRODUCTO FROM PRODUCTO WHERE STOCK=5 UPDATE PRODUCTO SET STOCK=100

WHERE ID_PRODUCTO=@ID PRINT 'PRODUCTO: '+@NOMBRE +' SE ACTUALIZO EL STOCK' CONTINUE--CONTINUE hace que el bucle WHILE se inicie de nuevo END --Comprobacion de los resultados SELECT * FROM PRODUCTO ----------------------------------------------------------------------------------------------Implemente un programa que permita listar los 100 primeros nmeros enteros, visu alizando --en cada caso si es par o impar. DECLARE @CONTADOR INT SET @CONTADOR=0 WHILE(@CONTADOR<100) BEGIN SET @CONTADOR=@CONTADOR+1 IF @CONTADOR%2=0 PRINT CAST(@CONTADOR AS VARCHAR)+' ES UN NUMERO PAR' ELSE PRINT CAST(@CONTADOR AS VARCHAR)+' ES UN NUMERO IMPAR' END --------------------------------------------------------------------------------------------Visualice un mensaje donde indique si un empleado ha realizado pedidos. DECLARE @IDEMP INT, @CANTIDAD INT SET @IDEMP = 1 --RECUPERAR LA CANTIDAD DE PEDIDOS DEL EMPLEADO DE CODIGO 1 SELECT @CANTIDAD = COUNT(*) FROM PEDIDO WHERE Cod_empleado = @IDEMP --EVALUA EL VALOR DE CANTIDAD IF @CANTIDAD = 0 PRINT 'EL EMPLEADO NO HA REALIZADO ALGUN PEDIDO' ELSE IF @CANTIDAD = 1 PRINT 'HA REGISTRADO 1 PEDIDO, CONTINUE TRABAJANDO' ELSE PRINT 'HA REGISTRADO PEDIDOS' GO ---------------------------------------------------------------------------------------------Declare una variable donde le asigne el nmero del mes, evale el valor de la vari able y -- retorne el mes en letras. DECLARE @M INT, @MES VARCHAR(20) SET @M=4 SET @MES = (CASE @M WHEN 1 THEN 'ENERO' WHEN 2 THEN 'FEBRERO' WHEN 3 THEN 'MARZO' WHEN 4 THEN 'ABRIL' WHEN 5 THEN 'MAYO' WHEN 6 THEN 'JUNIO' WHEN 7 THEN 'JULIO' WHEN 8 THEN 'AGOSTO'

WHEN 9 THEN 'SETIEMBRE' WHEN 10 THEN 'OCTUBRE' WHEN 11 THEN 'NOVIEMBRE' WHEN 12 THEN 'DICIEMBRE' ELSE 'NO ES MES VALIDO' END) PRINT @MES ----------------------------------------------------------------------------------------------Implemente un programa que permita listar los 100 primeros nmeros enteros, visu alizando --en cada caso si es par o impar. DECLARE @contador int SET @contador = 0 WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 IF @contador %2 =0 PRINT cast(@contador AS varchar) +' es un Nmero Par' ELSE PRINT cast(@contador AS varchar) + ' es un Nmero Impar' END -----------------------------------------------------------------------------------------------Implemente un bloque de instrucciones que permita eliminar un registro de Clie nte por su --cdigo. Si hay un error en el proceso, visualice un mensaje de error DELETE FROM Cliente WHERE Cod_cliente = 0 IF @@ERROR<>0 PRINT 'NO SE PUEDE ELIMINAR' OTRA FORMA BEGIN TRY DELETE FROM Cliente WHERE Cod_cliente = 196 END TRY BEGIN CATCH IF @@ERROR=547 PRINT 'NO SE PUEDE ELIMINAR ESTE CLIENTE' END CATCH --------------------------------------------------------------------------------------------******************************************************************************** ************* ---------------------------------------------------------------------------------------------cursores ******************************************************************************** ************* -----------------------------------------------------------------------------------------------Declaracion de variables para el cursor DECLARE @Id int, @Nombre varchar(255), @Apellido1 varchar(255), @Apellido2 varchar(255), @NifCif varchar(20), @FxNacimiento datetime -- Declaracin del cursor DECLARE cClientes CURSOR FOR

SELECT Id, Nombre, Apellido1, Apellido2, NifCif, FxNacimiento FROM CLIENTES -- Apertura del cursor OPEN cClientes -- Lectura de la primera fila del cursor FETCH cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimient o WHILE (@@FETCH_STATUS = 0 ) BEGIN PRINT @Nombre + ' ' + @Apellido1 + ' ' + @Apellido2 -- Lectura de la siguiente fila del cursor FETCH cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimient o END -- Cierre del cursor CLOSE cClientes -- Liberar los recursos DEALLOCATE cClientes

-- Declaracion de variables para el cursor DECLARE @Id int, @Nombre varchar(255), @Apellido1 varchar(255), @Apellido2 varchar(255), @NifCif varchar(20), @FxNacimiento datetime -- Declaracin del cursor DECLARE cClientes CURSOR SCROLL FOR SELECT Id, Nombre, Apellido1, Apellido2, NifCif, FxNacimiento FROM CLIENTES -- Apertura del cursor OPEN cClientes -- Lectura de la primera fila del cursor FETCH NEXT FROM cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento WHILE (@@FETCH_STATUS = 0 ) BEGIN PRINT @Nombre + ' ' + @Apellido1 + ' ' + @Apellido2 -- Lectura de la siguiente fila del cursor FETCH NEXT FROM cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif,@FxNacimiento END -- Lectura de la fila anterior FETCH PRIOR FROM cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento PRINT @Nombre + ' ' + @Apellido1 + ' ' + -- Cierre del cursor CLOSE cClientes -- Liberar los recursos DEALLOCATE cClientes @Apellido2

actualizamos el precio de los productos: si su stock es mayor o igual a 1000, se descuenta el precio al 50%, sino se descuenta el precio al 20%. -- DECLARACION DE VARIABLES PARA EL CURSOR DECLARE @ID INT, @NOMBRE VARCHAR(255), @PRECIO DECIMAL, @ST INT -- DECLARACIN DEL CURSOR DE ACTUALIZACION DECLARE CPRODUCTO CURSOR FOR SELECT IDPRODUCTO,NOMBREPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA FROM TB_PRODUCTOS FOR UPDATE -- APERTURA DEL CURSOR OPEN CPRODUCTO -- LECTURA DE LA PRIMERA FILA DEL CURSOR FETCH CPRODUCTO INTO@ID, @NOMBRE, @PRECIO, @ST -- MIENTRAS PUEDA LEER EL REGISTRO WHILE (@@FETCH_STATUS = 0 ) BEGIN IF(@ST>=1000) SET @PRECIO = 0.5*@PRECIO ELSE SET @PRECIO = 0.80*@PRECIO UPDATE TB_PRODUCTOS SET PRECIOUNIDAD = @PRECIO WHERE CURRENT OF CPRODUCTO --IMPRIMIR PRINT 'EL PRECIO DE PRODUCTO '+ @NOMBRE+ ' ES ' + STR(@PRECIO) -- LECTURA DE LA SIGUIENTE FILA DEL CURSOR FETCH CPRODUCTO INTO @ID, @NOMBRE, @PRECIO, @ST END -- CIERRE DEL CURSOR CLOSE CPRODUCTO -- LIBERAR LOS RECURSOS DEALLOCATE CPRODUCTO

-- Declaracion de variables para el cursor DECLARE @Id int, @Nombre varchar(255), @Apellido1 varchar(255), @Apellido2 varchar(255), @NifCif varchar(20), @FxNacimiento datetime -- Declaracin del cursor DECLARE cClientes CURSOR FOR SELECT Id, Nombre, Apellido1, Apellido2, NifCif, FxNacimiento FROM CLIENTES FOR UPDATE -- Apertura del cursor OPEN cClientes -- Lectura de la primera fila del cursor FETCH cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento WHILE (@@FETCH_STATUS = 0 ) BEGIN

UPDATE Clientes SET Apellido2 = isnull(@Apellido2, ' ') + ' - Modificado' WHERE CURRENT OF cClientes -- Lectura de la siguiente fila del cursor FETCH cClientes INTO @id, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento END -- Cierre del cursor CLOSE cClientes -- Liberar los recursos DEALLOCATE cClientes

--Trabajando con un cursor dinmico, defina un cursor dinmico que permita visualiza r: el primer registro, el registro en la posicin 6 y el ltimo registro. --CURSORES DECLARE MI_CURSOR CURSOR SCROLL FOR SELECT * FROM COMPRAS.PRODUCTOS -- ABRIR OPEN MI_CURSOR -- IMPRIMIR LOS REGISTROS FETCH FIRST FROM MI_CURSOR FETCH ABSOLUTE 6 FROM MI_CURSOR FETCH LAST FROM MI_CURSOR -- CERRAR CLOSE MI_CURSOR -- LIBERAR DEALLOCATE MI_CURSOR

--Trabajando con un cursor, listar los clientes registrados en la base de datos, incluya el nombre del pas. -- DECLARO VARIABLES DE TRABAJO DECLARE @ID VARCHAR(5) , @NOMBRE VARCHAR(50), @PAIS VARCHAR(50) -- DECLARO EL CURSOR DECLARE MI_CURSOR CURSOR FOR SELECT C.IDCLIENTE, C.NOMBRECLIENTE, P.NOMBREPAIS FROM VENTAS.CLIENTES C JOIN VENTAS.PAISES P ON C.IDPAIS=P.IDPAIS -- ABRIR OPEN MI_CURSOR -- LEER EL PRIMER REGISTRO FETCH MI_CURSOR INTO @ID, @NOMBRE, @PAIS --MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN --IMPRIMIR EL REGISTRO PRINT@ID+','+@NOMBRE+','+@PAIS --LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @ID, @NOMBRE, @PAIS END -- CERRAR CLOSE MI_CURSOR -- LIBERAR

DEALLOCATE MI_CURSOR; listar la relacin de los clientes que han registrado pedidos. En dicho proceso, d ebemos imprimir el nombre del cliente, la cantidad de pedidos registrados y al f inalizar totalizar el proceso (suma total de todos los pedidos). -- DECLARO VARIABLES DE TRABAJO DECLARE @NOMBRE VARCHAR(50), @Q INT, @TOTAL INT SET @TOTAL=0 -- DECLARO EL CURSOR DECLARE MI_CURSOR CURSOR FOR SELECT C.NOMBRECIA,COUNT(*) FROM VENTAS.CLIENTES C JOIN VENTAS.PEDIDOSCABE PC ON C.IDCLIENTE=PC.IDCLIENTE GROUP BY C.NOMBRECLIENTE -- ABRIR OPEN MI_CURSOR -- LEER EL PRIMER REGISTRO FETCH MI_CURSOR INTO @NOMBRE, @Q -- MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN -- IMPRIMIR EL REGISTRO PRINT @NOMBRE+','+CAST(@Q AS VARCHAR) -- ACUMULAR SET @TOTAL += @Q -- LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @NOMBRE, @Q END -- CERRAR CLOSE MI_CURSOR -- LIBERAR DEALLOCATE MI_CURSOR; -- IMPRIMIR PRINT 'TOTAL DE PEDIDOS:' + CAST(@TOTAL AS VARCHAR)

--mostrar el primer registro de productos DECLARE MI_CURSOR CURSOR FOR SELECT TOP 1 * FROM PRODUCTO --ABRIR OPEN MI_CURSOR -- IMPRRIMIR EL PRIMER REGISTRO FETCH NEXT FROM MI_CURSOR --CERRAR CLOSE MI_CURSOR --LIBERAR DEALLOCATE MI_CURSOR ----------------------------------------------------------------------------------------------- cursor dinmico, defina un cursor dinmico que permita visualizar: el primer regi stro, el

-- registro en la posicin 6 y el ltimo registro. DECLARE MI_CURSOR CURSOR SCROLL FOR SELECT * FROM PRODUCTO --ABRIR OPEN MI_CURSOR --NEXT lee la fila siguiente(nica opcin posible para los INSENSITIVE --CURSOR). --PRIOR lee la fila anterior --FIRST lee la primera fila --LAST lee la ltima fila --ABSOLUTE n lee la ensima fila del conjunto --RELATIVE n lee la ensima fila a partir de la fila actual. --IMPRIMIR LOS REGISTROS FETCH FIRST FROM MI_CURSOR FETCH ABSOLUTE 6 FROM MI_CURSOR FETCH LAST FROM MI_CURSOR --CEERRAR CLOSE MI_CURSOR --LIBERAR DEALLOCATE MI_CURSOR -----------------------------------------------------------------------------------------------listar los clientes registrados en la base de datos,incluya el nombre del pas. --DECLARO VARIABLES DE TRABAJO DECLARE @ID VARCHAR(5),@NOMBRE VARCHAR(50),@PAIS VARCHAR(50) --DECLARO EL CURSOR DECLARE MI_CURSOR CURSOR FOR SELECT C.ID_CLIENTE, C.NOMB_CLIENTE, P.NOMB_PAIS FROM CLIENTE C JOIN PAIS P ON C.ID_PAIS=P.ID_PAIS --ABRIR OPEN MI_CURSOR -- LEER EL PRIMER REGISTRO FETCH MI_CURSOR INTO @ID, @NOMBRE, @PAIS -- MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN --IMPRIMIR EL REGISTRO PRINT @ID + ','+@NOMBRE+','+@PAIS --LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @ID, @NOMBRE, @PAIS END --------------------------------------------------------------------------------------------/*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, p ara un determinado estudiante. la relacion resultante debe de tener la siguiente estructura R(semestre, nroAsignaAprobado,CredAprobado,credAcumulado)*/ --Elaboramos la tabla temporal con todas las asignaturas select M.*, A.credito

into #asig from matricula M INNER JOIN asignatura A on M.codAsignatura=A.codAsignatura where codEstudiante='1000120121' --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='1000120121' AND nota>10 --Elaboramos una tabla temporal con el numero de asignaturas select semestre,COUNT(codAsignatura) nroAsig into #totalAsignatura from #asig group by semestre order by semestre --Elaboramos una tabla temporal con el numero de asignaturas aprobadas y -- a suma de creditos por semestre select A.semestre,nroAsig,COUNT(codAsignatura) nroAsigAprobada, SUM(credito)cred Aprobado, 0 credAcumulado into #credAcumulado1 from #asigAprobada A INNER JOIN #totalAsignatura T on A.semestre=T.semestre group by A.semestre,nroAsig order by A.semestre --declaracion de variables declare @semestre varchar(7), @nroasig int,@nroAsigApro int, @credAprob int,@cre dAcum int, @codEstudiante char(11), @credAcumAux int --declaramos el cursor declare creditoAcumulado cursor for select semestre,nroasig,nroAsigAprobada,credAprobado,credAcumulado from #credAcumulado1 order by semestre --abrimos el cursor set @credAcumAux=0 open creditoAcumulado --imprimir resultados fetch next from creditoAcumulado into @semestre,@nroasig, @nroAsigApro,@credApro b,@credAcum while @@FETCH_STATUS=0 begin set @credAcumAux=@credAcumAux+@credAprob --actualizamos los creditos acumulados update #credAcumulado1 set credAcumulado=@credAcumAux where semestre=@semestre --asignamos el siguiente registro a la variable fetch next from creditoAcumulado into @semestre,@nroasig, @nroAsigApro,@credApro b,@credAcum end --cerramos close creditoAcumulado --liberamos recursos del cursor deallocate creditoAcumulado --resultados select * from #credAcumulado1 --------------------------------------------------------------------------------

--------------/*La universidad desea tener la relacion de carreras profesionales cuyo numero d e ingresantes haya disminuido de semestre a semestre en los ultimos tres semestr es, con el objetivo de evaluar la postergacion de ingresos a las carreras profes ionales con una evaluacion descendente de numeros de ingresantes */ --se crea la tabla temporal con todas las carreras profesionales select codCarrera,nomCarrera,0 semestre1, 0 semestre2, 0 semestre3 into #ingresantes from carreraProfesional --seleccionar los tres primeros semestres declare @ultimo varchar(7) declare @penultimo varchar(7) declare @antepenul varchar(7) select @ultimo=MAX(semestre)from estudiante select @penultimo=MAX(semestre)from estudiante where semestre<>@ultimo select @antepenul=MAX(semestre)from estudiante where semestre not in(@ultimo,@pe nultimo) --declaracion de variables para el cursor declare @codCarrera varchar(2), @semestre varchar(7), @codEstudiante char(11), @codCarreraAux varchar(2),@semestre1aux int,@semestre2aux int, @semestre3aux int ---declaramos el cursor declare ingresantescarrera cursor for select codCarrera, semestre,codEstudiante from estudiante where semestre in (@ultimo,@penultimo,@antepenul) order by codCarrera,semestre --abrimos el cursor set @codCarreraAux=' ' open ingresantescarrera --y asignamos el primer registro en las variables ya declaradas fetch next from ingresantescarrera 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=@ultimo set @semestre1aux=@semestre1aux+1 if @semestre=@penultimo set @semestre2aux=@semestre2aux+1 if @semestre=@antepenul set @semestre3aux=@semestre3aux+1 update #ingresantes set semestre1=@semestre1aux, semestre2=@semestre2aux, semestre3=@semestre3aux where codCarrera=@codCarrera --actualizamos codCarreraAux par comprobar con el siguiente registro set @codCarreraAux=@codCarrera fetch next from ingresantescarrera --apuntamos a la siguiente tupla into @codCarrera, @semestre,@codEstudiante end -- cerramos

close ingresantescarrera ---liberamos deallocate ingresantescarrera select * from #ingresantes -------------------------------------------------------------------------------------------/* Las empresas a nivel nacional, crean plazas de practicas a los mejores estudi antes de cada carrera, para lo cual consideran mejor estudiante a aquienes hayan optenido el promedio ponderado mas alto de su carrera profesional. En esta opor tunidad la universidad otorgara dos becas por carrera profesional, por lo tanto se desea tener la lista de los dos mejores estudiantes de cada carrera profesion al 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(nota*credito)/sum(credito)) 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, pro mPonderado 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 char(11), @codCarrera varchar(2), @promPonderado numeric(5,3),@puestoAux int, @puestoAnt i nt, @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 --imprimimos 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 --resultados select * from #promCarrera where puesto<=2 ---------------------------------------------------------------------------------------------Crear un procedimiento el cual recupere la lista de una carrera --profesional create procedure spu_estudiantesCarrera @codCarrera varchar(2) with encryption as begin select * from estudiante where codcarrera=@codcarrera end exec spu_estudiantesCarrera 'IS' --------------------------------------------------------------------------------------------/* Se desea tener un mecanismo para recuperar la informacion de los estudiantes de una carrera profesional, que no llevaron una determinada asignatura */ create procedure spu_estudiante_noLlevaronAsignatura @codCarrera varchar(2), @codAsignatura varchar(8) as begin select e.codEstudiante, e.apPaterno, e.apMaterno, e.nombres, e.codCarrera from estudiante e where codCarrera=@codCarrera and codEstudiante not in(select codEstudiante from matricula where codAsignatura=@co dAsignatura) end exec spu_estudiante_noLlevaronAsignatura 'IS','IIS1001' --------------------------------------------------------------------------------------------

/* En el sistema de control academico se requiere un procedimiento almacenado que recupere la informacion de las asignaturas de categoria OE si se tiene una variable de bandera de valor 1 o la lista de asignaturas EE si se tiene una variable bandera del tipo 0 */ create procedure spu_asignaturaCategoria @flagCategoria varchar(1) as begin if @flagCategoria='1' select * from asignatura where categoria='OE' else select * from asignatura where categoria='EE' end exec spu_asignaturaCategoria '1' ---------------------------------------------------------------------------------------------/* En el sistema de control academico se requiere un procedimiento almacenado que recupere en una variable el mensaje DESAPROBADO si un estudiante tiene una nota menor a 11 en una asignatura o el mensaje APROBADO si ocurre lo contrario */ create procedure spu_mensajeAprobDesap4 @codEstudiante varchar(11), @codAsignatura varchar(8), @mensaje varchar(10)output with encryption as begin if(select nota from matricula where codAsignatura=@codAsignatura and codEstudiante=@codEstudiante)<11 set @mensaje='DESAPROBADO' else set @mensaje='APROBADO' end declare @mensaje varchar(10) exec spu_mensajeAprobDesap4 '1000120121 ','IIS10001',@mensaje=@mensaje output print 'Estudiante'+cast(@codEstudiante)'@mensaje --Eliminar un procedmiento drop procedure spu_mensajeAprobDesap ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------MOSTRAR LA LISTA DE LOS ESTUDIANTES CON EL TOTAL DE CURSOS MATRICULADOS Y TOTA L DE CREDITOS -- QUE SE MATRICULO EN EL SEMESTRE 2010-I SELECT E.codEstudiante, E.nombres,COUNT(M.codAsignatura) AS 'TOTAL ASIGNATURAS', SUM(credito) AS 'TOTAL DE CREDITOS' FROM estudiante E JOIN matricula M ON E.codEstudiante = M.codEstudiante JOIN asignatura A ON M.codAsignatura=A.codAsignatura WHERE M.semestre='2010-I' GROUP BY E.codEstudiante,E.nombres --MOSTRAR LA LISTA DE ESTUDIANTES MATRICULADOS, LA CANTIDAD DE ASIGNATURAS QUE S E

--MATRICUL Y EL PROMEDIO ARITMETICO DEL SEMESTRE MATRICULADO(SEMESTRE 2010-I). SELECT E.codEstudiante,E.nombres AS 'NOMBRE DEL ESTUDIANTE', COUNT(*) AS 'CANTIDAD DE ASIGNATURAS', AVG(nota) AS 'PROMEDIO ARITMETICO' FROM estudiante E JOIN matricula M ON E.codEstudiante = M.codEstudiante WHERE M.semestre='2010-I' GROUP BY E.codEstudiante, E.nombres --MOSTRAR LA LISTA DE ESTUDIANTES QUE TENGAN EL PROMEDIO SEMESTRAL(2010-I) -- APROBADO Y LA CANTIDAD DE ASIGNATURAS QUE SE MATRICUL. SELECT E.codEstudiante,E.nombres AS 'NOMBRE DEL ESTUDIANTE', COUNT(*) AS 'CANTIDAD DE ASIGNATURAS', AVG(nota) AS 'PROMEDIO ARITMETICO' FROM estudiante E JOIN matricula M ON E.codEstudiante = M.codEstudiante WHERE M.semestre='2010-I' GROUP BY E.codEstudiante, E.nombres HAVING AVG(nota)>10 --LISTAR A LOS ESTUDIANTES DE INGENIERIA DE SISTEMAS, LAS NOTAS MAXIMAS Y --MINIMAS DE CADA UNO DE ELLOS. SELECT E.codEstudiante,E.nombres, MAX(nota) AS 'NOTA MAXIMA', MIN(nota) AS 'NOTA MINIMA' FROM estudiante E JOIN matricula M ON E.codEstudiante=M.codEstudiante WHERE E.codCarrera='SI' GROUP BY E.codEstudiante,E.nombres

-- MOSTRAR LA NOTA MAXIMA Y MINIMA DE LA CARRERA PROFESIONAL DE SISTEMAS SELECT MAX(nota) AS 'NOTA MAXIMA', MIN(nota) AS 'NOTA MINIMA' FROM matricula M JOIN estudiante E ON E.codEstudiante=M.codEstudiante WHERE E.codCarrera='SI' --****************************************************************************** ********** -- Mostrar la suma de los pedidos registrados en el ao 2003. SELECT SUM(dp.Cantidad*dp.Precio_por_unidad) AS 'SUMA' FROM Pedido p JOIN Detalle_pedido dp ON p.ID_pedido = dp.ID_pedido WHERE YEAR(p.Fecha_pedido)=2003 --mostrar la cantidad de pedidos registrados por empleado en el ao 2003 y los em pleados --que no registraron pedidos en el 2003. SELECT e.Nombres, e.Apellidos, COUNT(*) AS CANTIDAD

FROM EMPLEADO E JOIN PEDIDO P ON e.Cod_empleado = P.Cod_empleado WHERE YEAR(P.Fecha_pedido)=2003 GROUP BY e.Nombres, e.Apellidos UNION SELECT e.Nombres, e.Apellidos, 0 AS CANTIDAD FROM EMPLEADO E WHERE e.Cod_empleado NOT IN(SELECT P.Cod_empleado FROM PEDIDO P WHERE YEAR(p.Fecha_pedido)=2003)

--Listar los clientes que hayan pedido el mismo producto por 3ra vez y que hayan --realizado mas de 3 pedidos select Nombre_cliente,pr.Nombre_producto, COUNT(p.ID_pedido) as cantidad, COUNT(pr.Cod_producto) as [cantidad de productos] from Cliente c inner join Pedido p on c.Cod_cliente=p.Cod_cliente inner join Detalle_pedido d on p.ID_pedido=d.ID_pedido inner join Producto pr on pr.Cod_producto=d.Cod_producto group by c.Nombre_cliente, pr.Nombre_producto having((COUNT(p.ID_pedido)>2) and (COUNT(pr.Cod_producto)<4)) --Mostrar los clientes cuyo importe total de pedidos (suma de pedidos registrado s --por cada cliente) sea mayor a 1000. SELECT C.Nombre_cliente AS 'CLIENTE', SUM(Cantidad*Precio_por_unidad) AS 'SUMA' FROM Detalle_pedido PD JOIN Pedido P ON PD.ID_pedido = P.ID_pedido JOIN Cliente C ON C.Cod_cliente = P.Cod_cliente GROUP BY C.Nombre_cliente HAVING SUM(Cantidad*Precio_por_unidad)>1000 --Mostrar los clientes cuyo importe total de pedidos (suma de pedidos registrado s --por cliente) sea mayor a 1000 siendo registrados en el ao 2003. SELECT C.Nombre_cliente AS 'CLIENTE', SUM(Cantidad*Precio_por_unidad) AS 'SUMA' FROM Detalle_pedido PD JOIN Pedido P ON PD.ID_pedido = P.ID_pedido JOIN Cliente C ON C.Cod_cliente = P.Cod_cliente WHERE YEAR(Fecha_pedido)=2003 GROUP BY C.Nombre_cliente HAVING SUM(Cantidad*Precio_por_unidad)>1000 --Listar la cantidad de pedidos registrados por cada empleado y ao, totalizando --la cantidad de pedidos por cada ao. SELECT E.Nombres+','+E.Apellidos AS 'EMPLEADO', YEAR(P.Fecha_pedido) AS 'AO', COUNT(*) AS 'CANTIDAD' FROM Pedido P JOIN Empleado E

ON P.Cod_empleado = E.Cod_empleado GROUP BY CUBE( E.Nombres +','+E.Apellidos, YEAR(P.Fecha_pedido)) --Mostrar la cantidad de pedidos registrados por cada ao. Al finalizar visualice -- la cantidad total de pedidos. SELECT YEAR(Fecha_pedido) AS 'AO', COUNT(*) AS 'CANTIDAD' FROM Pedido GROUP BY YEAR(Fecha_pedido) WITH ROLLUP --Mostrar la cantidad de pedidos registrados por cada empleado y por ao, -- al finalizar visualice la cantidad total de pedidos por cada empleado y --la cantidad total de todos los pedidos. SELECT E.Nombres AS 'EMPLEADO', YEAR(P.Fecha_pedido) AS 'AO', COUNT(*) AS 'CANTIDAD' FROM Pedido P JOIN Empleado E ON P.Cod_empleado = E.Cod_empleado GROUP BY E.Nombres, YEAR(P.Fecha_pedido) WITH ROLLUP *********************************** tt *************************************** -- Numero de estudiantes matriculados por semestre y carrera profesional select m.*, e.codCarrera into #matriculaCP from matricula m 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 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 #ultimamatricula from matricula m join #ultimosemestre u on m.semestre=u.ultimosemestre select um.semestre, um.codAsignatura, COUNT(codEstudiante)as nrodeestudiantes

into #asignaturasestudiantes2 from #ultimamatricula um group by um.semestre, um.codAsignatura having COUNT(codEstudiante)<7 select ae.semestre,ae.codAsignatura, a.denominacion,ae.nrodeestudiantes from #asignaturasestudiantes2 ae join asignatura a on ae.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 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 join asignatura b on a.codAsignatura=b.codAsignatura select a.*, e.apPaterno, e.apMaterno, e.nombres, e.codCarrera from #asignaturaDenominacion a 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 30 estudiantes (con el objetivo de crear dos g rupos) select * into #asignaturaEspecialidad1 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 #asignaturaEspecialidad1 a 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)>30 --Relacion de carrera profesionales con menos de 10 estudiantes ingresantes en e l ultimo

--semestre declare @ultimoSemestre varchar(7) select @ultimoSemestre= max(semestre) from matricula select c.codCarrera, c.nomCarrera, count(codEstudiante) nroEstudiantes from carreraProfesional c join estudiante e on c.codCarrera=e.codCarrera where e.semestre=@ultimoSemestre group by c.codCarrera, c.nomCarrera having count(codEstudiante)<10

Potrebbero piacerti anche