SQL Ejercicios 3 Solucionario
SQL Ejercicios 3 Solucionario
SQL Ejercicios 3 Solucionario
--b) Ídem pero que muestre el carácter que ocupa la posición central de la
cadena.
if object_id('PosicionCentral') is not null
drop proc PosicionCentral
go
create proc PosicionCentral(@cadena varchar(20))
as
select substring(@cadena,(len(@cadena)/2)+1,1)
--3 Escribe una función que solicite como parámetros 2 números enteros A y B, y
que devuelva la tabla de multiplicar
--de A del 1 al número B usando un bucle WHILE, por ejemplo para la siguiente
instrucción deberá resolver:
CREATE function [TABLA_MULT](@A INT , @B INT)
RETURNS @TABLA3 TABLE (RESUL VARCHAR(30))
AS
BEGIN
DECLARE @X INT=1
WHILE (@X<=@B)
BEGIN
INSERT INTO @TABLA3(RESUL)
VALUES (CONCAT(@A,' x ',@X,' = ',@A*@X ))
SET @X=@X+1
END
RETURN
END
SELECT * FROM [dbo].[TABLA_MULT](9,10)
USE HR
--4. Construya un store que muestre cuente el número de las filas totales de las
tablas:
--[dbo].[departments]
--[dbo].[countries]
--[dbo].[jobs]
if object_id('SP_FILTAS_TOTAL') is not null
drop proc SP_FILTAS_TOTAL
go
create PROCEDURE SP_FILTAS_TOTAL
AS
BEGIN
WITH FILAS AS
(
SELECT 'departments' AS TABLAS, COUNT(*) AS FILAS FROM departments
UNION
SELECT 'countries' AS TABLAS, COUNT(*) FROM countries
UNION
SELECT 'jobs' AS TABLAS , COUNT(*) FROM jobs
)
--
SELECT * FROM FILAS
END ;
--
EXECUTE SP_FILTAS_TOTAL
----FORMA 2
SP_FILTAS_TOTAL
CREATE PROCEDURE SP_FILTAS_TOTAL2
AS
BEGIN
select SO.Name as Tabla,si.rows as 'filas'
from sysobjects as SO
join sysindexes as SI on SO.Id = SI.id
WHERE SO.Name IN ('departments','countries','jobs')
AND si.rows<>0
order by si.rows desc
END
EXECUTE SP_FILTAS_TOTAL2
--7. En base al store del ejericio 3 aplique el filtro para mostras los empleados
de las ciudades: Toronto y Munich (Use ALTER)
alter PROCEDURE SP_DATOS_TABLAS
AS
BEGIN
declare @ciudad1 varchar(15);
declare @ciudad2 varchar(15);
set @ciudad1 ='Toronto'
set @ciudad2='Munich'
--8. Construya una función escalar que reciba el salario anual ([salary]) y el
porcentaje de comisión ([comission_pct]),
--y calcule el salario total neto (si el porcentaje de comisión es nulo, asumir
que es cero).
--Descontar el 20% por concepto de impuestos, siempre que el salario total sea
mayor a 30000 soles.
--Finalmente, si el empleado es de ventas (donde el job_id empiece con "SA_")
adicionar una bonificación del 10%
--después del decuento anterior.
if object_id('Fn_SALARIO','FN') is not null
drop function Fn_SALARIO
go
create FUNCTION Fn_SALARIO
(@SALARY MONEY,
@COMI MONEY
)
RETURNS FLOAT
as
begin
declare @SALDO FLOAT
BEGIN
SELECT @SALDO =E.salary+E.salary*(E.COMI/100) FROM
(SELECT *, COMI= CASE WHEN commission_pct IS
NULL THEN 0
ELSE commission_pct
END FROM EMPLOYEES ) E
WHERE E.SALARY=@SALARY AND E.COMI=@COMI
END ;
BEGIN
DECLARE @TRA VARCHAR(20)
SELECT DISTINCT @TRA=[job_id] FROM (SELECT *, COMI= CASE WHEN
commission_pct IS NULL THEN 0
ELSE commission_pct
END FROM EMPLOYEES) F
WHERE F.JOB_ID LIKE 'SA_%' AND F.SALARY=@SALARY AND
F.COMI=@COMI
END;
IF(@SALDO>30000 AND @TRA LIKE 'SA_%')
SET @SALDO=(@SALDO-0.2*@SALDO)+0.1*(@SALDO-0.2*@SALDO)
ELSE IF (@SALDO>30000 AND @TRA NOT LIKE 'SA_%')
SET @SALDO=(@SALDO-0.2*@SALDO)
ELSE IF (@SALDO<30000 AND @TRA LIKE 'SA_%')
SET @SALDO=@SALDO+@SALDO*0.1
ELSE IF (@SALDO<30000 AND @TRA NOT LIKE 'SA_%')
SET @SALDO=@SALDO
RETURN @SALDO
END
---9 Construya una función que reciba un [employee_id] y devuelva un mensaje como
el siguiente:
--"El empleado STEVEN KING con cargo PRESIDENT se dio de alta el 17 de
junio del 2003."
from [dbo].[employees] a
inner join [dbo].[jobs] b on A.job_id=b.job_id
where A.employee_id=@employee_id
)
select * from Fn_mensaje(100)
--
CREATE TABLE [dbo].[AUDI_employees](
[employee_id] [int] NOT NULL,
[first_name] [varchar](20) NOT NULL,
[last_name] [varchar](25) NOT NULL,
[email] [varchar](25) NOT NULL,
[phone_number] [varchar](20) NOT NULL,
[hire_date] [date] NOT NULL,
[job_id] [varchar](10) NOT NULL,
[salary] [money] NOT NULL,
[commission_pct] [money] NULL,
[manager_id] [int] NULL,
[department_id] [int] NULL,
Operacion varchar(5),
FechaOperacion datetime)
--12. Contruya un store que muestre las Ordenes ([dbo].[Orders]) por Empleado y
que tenga como parametro el año de la orden
if object_id('Sp_muestra_orde_anio') is not null
drop proc Sp_muestra_orde_anio
go
create PROCEDURE Sp_muestra_orde_anio( @anio char(4))
as
begin
select OrderID,employeeS.Lastname,OrderDate from [dbo].[Orders]
INNER JOIN employeeS ON employeeS.EmployeeID=orders.EmployeeID
where cast(year(OrderDate) as char(4))=@anio
order by employeeS.EmployeeID asc
end
---
exec Sp_muestra_orde_anio '1996'
--13. Construya una función que reciba un [department_id] y muestre una tabla que
contenga todos los empleados de ese departamento
-- Se debe mostrar el nombre completo de cada empleado, antigüedad del
empleado en meses, salario final ([salary] y [commission_pct])
--y la descripción del empleo. De no existir un departamento con el
[department_id] ingresado que muestre un mensaje de error.
use HR
go
if object_id('dbo.pregunta_13','FN') is not null
drop function pregunta_13
go
return
end
-- Base AdventureWorks
--14. Construya un store que muestre las ventas ([Sales].[SalesOrderHeader]) por
mes teniendo como parametro el año de la venta
use AdventureWorks2014
go
--
if object_id('dbo.pregunta_14') is not null
drop procedure pregunta_14
go
create procedure dbo.pregunta_14(@anio char (4))
as
begin
SELECT * FROM [Sales].[SalesOrderHeader]
WHERE cast(year(OrderDate) as char(4))=@anio
end
--
--6///
--
--7//
IF OBJECT_ID('ClientesAtendidos') IS NOT NULL
DROP PROC ClientesAtendidos
GO
CREATE PROC ClientesAtendidos @nombre VARCHAR(20)
AS
BEGIN
SELECT COUNT(*) CANT FROM [Person].[Person] PP
INNER JOIN [Sales].[SalesOrderDetail] SD ON PP.BusinessEntityID=SD.OrderQty
WHERE FirstName = @nombre
GROUP BY FirstName
END
--
EXEC ClientesAtendidos 'Terri'
--8
ALTER TABLE [Sales].[SalesOrderDetail]ADD pagado BIT;
ALTER TABLE [Sales].[SalesOrderDetail] ADD fecha_pago DATETIME;
UPDATE [Sales].[SalesOrderDetail] SET pagado = 0;
--
IF OBJECT_ID('SP_UPDATE') IS NOT NULL
DROP PROC SP_UPDATE
GO
CREATE PROC SP_UPDATE (@nombre INT)
AS
BEGIN
UPDATE [Sales].[SalesOrderDetail]
SET pagado=1, FECHA_PAGO=GETDATE()
WHERE SalesOrderID=43659
END
--
EXECUTE SP_UPDATE 43659