Está en la página 1de 10

UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

LABORATORIO Nº 02
PROGRAMACIÓN DE FUNCIONES ESCALARES Y DE TABLAS

1. FUNCIÓN PARA OBTENER LA LISTA DE NÚMEROS PERFECTOS MENORES A 40

NUMERO PERFECTO: Se dice que un número es PERFECTO cuando es igual a la suma


de sus divisores, excepto el mismo número.

Ejemplo:
6, es número perfecto; porque la suma de sus divisores: (1, 2, y 3); es 6.

Solución:
Para obtener la lista de números perfectos menores a 40; desarrollaremos:

a) Función para calcular la suma de los divisores de un número


b) Función que explora la lista de números menores a 40 y verifica; por cada número, si la
suma de sus divisores es igual al mismo número.

Solución:
--a) Calculando la Suma de Divisores de un número
use AdventureWorks2012
go
if OBJECT_ID('dbo.fnSumarDivisores', 'FN') is not null
drop function dbo.fnSumarDivisores
go
create function dbo.fnSumarDivisores(@num int, @mitad int, @SumaDivisor int)
returns int
AS
Begin
declare @Suma int
if @mitad=0
set @Suma=@SumaDivisor
else
begin
if @num%@mitad=0
set @Suma=dbo.fnSumarDivisores(@num, @mitad-1, @SumaDivisor+@mitad)
else
set @Suma=dbo.fnSumarDivisores(@num, @mitad-1, @SumaDivisor)
end
return @Suma
End
go
--Ejecutando la funcion dbo.fnSumarDivisores
use AdventureWorks2012
go
declare @num int
set @num=6
select @num as Número,
dbo.fnSumarDivisores(@num, @num/2, 0) as 'Suma Divisores de n'
go
-- Línea de resultados

DR. LUIS BOY CHAVIL Página 1


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

--b) Lista de números perfectos menores a 40


use AdventureWorks2012
go
if OBJECT_ID('dbo.fnVerPerfectos', 'FN') is not null
drop function dbo.fnVerPerfectos
go
create function dbo.fnVerPerfectos(@num int)
returns @TablaPerfectos table(numero int not null primary key)
AS
Begin
declare @perf int
set @perf=2
while @perf<=@num
begin
if dbo.fnSumarDivisores(@perf, @perf/2, 0)=@perf
insert into @TablaPerfectos values (@perf)
set @perf+=1
end
return
End
go

--Ejecución de la función para ver los números perfectos menores a 40


select *
from dbo.fnVerPerfectos(40)
go
-- Línea de resultados

2. FUNCIÓN PARA OBTENER LA LISTA DE NÚMEROS COMPLETOS MENORES A 40

NÚMERO COMPLETO: Se dice que un número es COMPLETO; si y solamente si,


dicho número es igual a la suma de sus dígitos más la suma desde 1 hasta el valor de
cada dígito.

Ejemplo:
25 es un número completo; pues: 25 = (2+5)+(1+2)+(1+2+3+4+5)
36 es un número completo; pues: 36 = (3+6)+(1+2+3)+(1+2+3+4+5+6)

Solución:
Para obtener la lista de números completos menores o iguales a 40; haremos:

a) Función para calcular la suma de los dígitos de un número


b) Función para calcular la suma desde 1 hasta un número n.
c) Función para hacer el cálculo de un número completo
d) Función que explora la lista de números menores a 40 y verifica; por cada número,
si es completo.

DR. LUIS BOY CHAVIL Página 2


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

-- a) Función para Calcular la Suma de los dígitos de un número

use AdventureWorks2012
go
if OBJECT_ID('dbo.fnSumarDigitos', 'FN') is not null
drop function dbo.fnSumarDigitos
go
create function dbo.fnSumarDigitos(@num int)
returns int
AS
Begin
declare @Suma int
if @num<10
set @Suma=@num
else
set @Suma=@num%10+dbo.fnSumarDigitos(@num/10)
return @Suma
End
go

--Ejecutando la función dbo.fnSumarDigitos


use AdventureWorks2012
go
declare @num int
set @num=25
select @num as Número,
dbo.fnSumarDigitos (@num) as 'Suma de Dígitos'
go

-- Línea de resultados

-- b) Función para calcular la suma desde 1 hasta n


use AdventureWorks2012
go
if OBJECT_ID('dbo.fnSumar1aN', 'FN') is not null
drop function dbo.fnSumar1aN
go
create function dbo.fnSumar1aN(@num int)
returns int
AS
Begin
declare @Suma int
if @num=1 or @num=0
set @Suma=@num
else
set @Suma=@num+dbo.fnSumar1aN(@num-1)
return @Suma
End
go

DR. LUIS BOY CHAVIL Página 3


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

--Ejecutando la función dbo.fnSumar1aN


use AdventureWorks2012
go
declare @num int
set @num=4
select @num as Número,
dbo.fnSumar1aN (@num) as 'Suma de 1 a N'
go

-- Línea de resultados

--c) Función para hacer el cálculo de un número COMPLETO

use AdventureWorks2012
go
if OBJECT_ID('dbo.fnNumCompleto', 'FN') is not null
drop function dbo.fnNumCompleto
go
create function dbo.fnNumCompleto(@n int, @m int, @total int)
returns int
AS
Begin
declare @Suma int
if @n=0
set @Suma=@total+dbo.fnSumaDigitos(@m)
else
set @Suma=dbo.fnNumCompleto(@n/10, @m, @total+dbo.fnSuma1aN(@n%10))
return @Suma
End
go

-- Utilizando la función que calcula para un número Completo

use AdventureWorks2012
go
declare @num int
set @num=25
select @num as Número,
dbo.fnNumCompleto(@num, @num, 0) as 'Calcular estado COMPLETO'
go
-- Línea de resultados

--d) Lista de números completos menores a 40


use AdventureWorks2012
go
if OBJECT_ID('dbo.fnVerCompletos', 'FN') is not null
drop function dbo.fnVerCompletos
go
create function dbo.fnVerCompletos(@num int)
returns @TablaCompletos table(numero int not null primary key)
AS

DR. LUIS BOY CHAVIL Página 4


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

Begin
declare @comp int
set @comp=2
while @comp<=@num
begin
if dbo.fnNumCompleto(@comp, @comp, 0)=@comp
insert into @TablaCompletos values (@comp)
set @comp+=1
end
return
End
go

--Ejecución de la función para ver los números completos menores a 40


select *
from dbo.fnVerCompletos(40)
go

-- Línea de resultados

3. FUNCIÓN PARA OBTENER LA LISTA DE NÚMEROS CAPICÚAS MENORES A 40

NÚMERO CAPICÚA: Se dice que un número es Capicúa cuando se lee igual de derecha a
izquierda.

Ejemplo:
11 es un número capicúa; pues: 11 se lee igual de derecha a izquierda.

Solución:
Para obtener la lista de números capicúas menores o iguales a 40; haremos:

a) Función para obtener un número escrito al revés


b) Función que explora la lista de números menores a 40 y verifica; por cada número, si
es capicúa.

-- a) Función para obtener un número invertido


use AdventureWorks2012
go
if OBJECT_ID('dbo.fnNumInvertido', 'FN') is not null
drop function dbo.fnNumInvertido
go
create function dbo.fnNumInvertido(@num int, @inv int)
returns int
AS
Begin
declare @contrario int
if @num=0
set @contrario=@inv
else
set @contrario=dbo.fnNumInvertido(@num/10, @num%10+@inv*10)
return @contrario
End
go

DR. LUIS BOY CHAVIL Página 5


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

-- Línea de resultados

use AdventureWorks2012
go
declare @num int
set @num=25
select @num as Número,
dbo.fnNumInvertido(@num, 0) as 'Invertido de n'
go

--b) Lista de números capicúas menores a 40

use AdventureWorks2012
go
if OBJECT_ID('dbo.fnVerCapicuas', 'FN') is not null
drop function dbo.fnVerCapicuas
go
create function dbo.fnVerCapicuas(@num int)
returns @TablaCapicuas table(numero int not null primary key)
AS
Begin
declare @cap int
set @cap=2
while @cap<=@num
begin
if dbo.fnNumInvertido(@cap, 0)=@cap
insert into @TablaCapicuas values (@cap)
set @cap+=1
end
return
End
go

--Ejecución de la función para ver los números capicúas menores a 40


select *
from dbo.fnVerCapicuas(40)
go
-- Línea de resultados

DR. LUIS BOY CHAVIL Página 6


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

FUNCIONES INTEGRADAS DE T-SQL


-- Uso de SUM
USE AdventureWorks2012
go
select Color as Color,
SUM(ListPrice) as 'Total de precio en lista',
SUM(StandardCost) as 'Total de costo estándar'
from Production.Product
where Color is not null
and ListPrice != 0.00
and Name LIKE 'Mountain%'
group by Color
order by Color;
go

-- Uso de MAX
USE AdventureWorks2012
go
select max(TaxRate) as ‘Tasa máxima de Impuesto’
from Sales.SalesTaxRate
go

-- Uso de MIN
USE AdventureWorks2012
go
select min(TaxRate) as ‘Tasa mínima de Impuesto’
from Sales.SalesTaxRate
go

DR. LUIS BOY CHAVIL Página 7


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

-- Uso de AVG
USE AdventureWorks2012
go
select AVG(VacationHours) as 'Promedio de horas de vacaciones',
SUM(SickleaveHours) as 'Total de Horas de licencia por Enfermedad'
from HumanResources.Employee
where Title LIKE 'Vice President%'
go

-- Uso de COUNT
USE AdventureWorks2012
go
select count(*) as 'Nº Personas',
avg(Bonus) as 'Promedio de bonos'
from Sales.SalesPerson
where SalesQuota>25000;
go

-- Uso de CAST
USE AdventureWorks2012
go
select substring(P.Name, 1, 20) as 'Nombre corto de Producto',
P.ListPrice as 'Precio en lista'
from Production.Product P
where cast(ListPrice as Int) LIKE '3%'
go

DR. LUIS BOY CHAVIL Página 8


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

-- Usando CONVERT
USE AdventureWorks2012
go
select substring(P.Name, 1, 20) as 'Nombre corto de Producto',
P.ListPrice as 'Precio en lista'
from Production.Product P
where convert(int, ListPrice) LIKE '3%'
go

-- Concatenando expresiones no binarias que no son de caracteres mediante CAST

USE AdventureWorks2012
go
select 'La lista de precios es '+cast(ListPrice as varchar(12)) as ListaPrecio
from Production.Product
where ListPrice Between 350.00 and 400.00
go

-- fecha y hora actual del sistema


select getdate() as 'Fecha y Hora'
go

-- Año de la fecha actual


select datepart("year", getdate()) as 'Año actual'
go

DR. LUIS BOY CHAVIL Página 9


UNIVERSIDAD NACIONAL DE TRUJILLO Base de datos Avanzadas

-- Número de días entre una fecha de la columna ModifiedDate


-- y la fecha actual del sistema.

USE AdventureWorks2012
go
use AdventureWorks2012
go
select DATEDIFF("dd", ModifiedDate, GETDATE())
from HumanResources.Employee E
where E.BusinessEntityID=1
go

-- Agregar 3 meses a la fecha actual


select DATEADD("Month", 3, GETDATE())
go

-- Mostrar todos los vicepresidentes y el tiempo que tienen en la compañía


USE AdventureWorks2012
go
select E.JobTitle as 'Cargo',
DATEDIFF("dd", Hiredate, GETDATE()) as Dias,
DATEDIFF("week", Hiredate, GETDATE()) as Semanas,
DATEDIFF("mm", Hiredate, GETDATE()) as Meses,
DATEDIFF("yy", Hiredate, GETDATE()) as Años
from HumanResources.Employee E
where E.JobTitle LIKE 'Vice%'
go

DR. LUIS BOY CHAVIL Página 10

También podría gustarte