Documentos de Académico
Documentos de Profesional
Documentos de Cultura
5-Programación de Funciones Escalares
5-Programación de Funciones Escalares
LABORATORIO Nº 02
PROGRAMACIÓN DE FUNCIONES ESCALARES Y DE TABLAS
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:
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
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:
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
-- Línea de resultados
-- Línea de resultados
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
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
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
-- Línea de resultados
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:
-- 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
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
-- 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
-- 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
-- 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
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
USE AdventureWorks2012
go
use AdventureWorks2012
go
select DATEDIFF("dd", ModifiedDate, GETDATE())
from HumanResources.Employee E
where E.BusinessEntityID=1
go