Funksionet Tabele

FUNKSIONET TABELE

Problem 1- Ndertoni nje funksion i cili kthen nje liste me emrat e furnitoreve nga te cilet blejme me shume se n(psh 2) produkte

Zgjidhje

-- te ndertojme nje funksion i cili

-- kthen emrat e furnitoreve nga te cilet ne blejme

--me shume se n produkte , psh n=2

CREATE FUNCTION activesuppliers(@n as int)

returns table

as

return

(

SELECT companyName

FROM Suppliers

where SupplierID IN

(

SELECT SupplierID

FROM Products

group by SupplierID

having COUNT(*)>@n


)

)

Po ta perdorim funksionin:

SELECT * from dbo.activesuppliers(3)

do te na kthente emrat e furnitoreve nga te cilet blejme me shume se 3 produkte

-- libri i sshitjeve per nje periiudhe kohore midis dt1 dh dt2

-- te ndertojme nje funksion

CREATE FUNCTION LibriShitjeve(@dt1 as date,@dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT OrderId 'FatureNr',OrderDate 'Date',CustomerID 'KodiKlientit',

dbo.CustomerName(CustomerID) 'Klienti',dbo.VlereFature(OrderID) 'Vlera'

FROM Orders

where OrderDate BETWEEN @dt1 AND @dt2

)

-- per librin e shitjeve te muajit korrik 1996

SELECT * FROM LibriSHitjeve('1996-07-01','1996-08-01')

Problem 2

-- ndertoni nje funksion tabele qe kthen listen e klienteve qe kane kryer

-- nje numer transaksionesh me te madh se n

CREATE FUNCTION CustByTrans(@transno as int)

RETURNS TABLE

AS

RETURN

(

SELECT * from customers

where CustomerId IN

(

SELECT CustomerID from Orders

group by CustomerID

HAVING count(*)>@transno

)

)

ose

CREATE FUNCTION CustByTrans2(@transno as int)

RETURNS TABLE

AS

RETURN

(

SELECT CustomerId,dbo.CustomerName(CustomerID) 'Customer' from Orders

group by CustomerID

HAVING count(*)>@transno

)

.....

-- te ndertojme nje funksion qe merr si argument

-- emrin e nje periudhe dhe dy data d1 dhe d2 qe kufizojne periudhen

-- funksioni kthen shitjet ne ate periiudhe

CREATE FUNCTION shitjetperiudhe(@periudha varchar(50),@dt1 as date, @dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT @periudha as 'periudha',SUM(dbo.VlereFature(OrderID)) 'shitje'

FROM Orders

WHERE OrderDate BETWEEN @dt1 AND @dt2

)

SELECT * from dbo.shitjetperiudhe('korrik 1996','1996-07-01','1996-07-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('gusht 1996','1996-08-01','1996-08-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('shtator 1996','1996-09-01','1996-09-30')

UNION ALL

SELECT * from dbo.shitjetperiudhe('tetor 1996','1996-10-01','1996-10-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('nentor 1996','1996-11-01','1996-11-30')

UNION ALL

SELECT * from dbo.shitjetperiudhe('dhjetor 1996','1996-12-01','1996-12-31')

-- te ndertojme nje raport mbi shitjet mujore per cdo shtet

CREATE FUNCTION shitjetperiudheshtet(@periudha varchar(50),@dt1 as date, @dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT @periudha as 'periudha',shipcountry,SUM(dbo.VlereFature(OrderID)) 'shitje'

FROM Orders

WHERE OrderDate BETWEEN @dt1 AND @dt2

GROUP BY shipcountry

)

SELECT * from dbo.shitjetperiudheshtet('korrik','1996-07-01','1996-07-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('gusht','1996-08-01','1996-08-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('shtator','1996-09-01','1996-09-30')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('tetor','1996-10-01','1996-10-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('nentor','1996-11-01','1996-11-30')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('dhjetor','1996-12-01','1996-12-31')

-- ta parametrizojme kete query

-- qe te mos e shkruajme prape

-- te bejme nje funksion tabele

CREATE FUNCTION PunonjesGreat

(

@dt1 as datetime,

@dt2 as datetime,

@amount as float

)

RETURNS TABLE

AS

RETURN

(

SELECT Employees.EmployeeID,Employees.FirstName,Employees.LastName,

SUM([Order Details].UnitPrice*[Order Details].Quantity) 'value'

FROM

Employees inner join Orders ON Employees.EmployeeID=Orders.EmployeeID

inner join [Order Details] ON Orders.OrderID=[Order Details].OrderID

where Orders.OrderDate between @dt1 and @dt2

GROUP by Employees.EmployeeID,Employees.FirstName,Employees.LastName

having SUM([Order Details].UnitPrice*[Order Details].Quantity)>@amount

)

-

CREATE FUNCTION dbo.EmriPunonjesit(@kodi as int)

RETURNS varchar(100)

AS

BEGIN

DECLARE @res as varchar(100)

select @res=(Firstname+' '+Lastname) from Employees

where EmployeeId=@kodi

return @res

END

SHEMBULL ME funksionet

SELECT 1996 as 'viti',SUM(dbo.VlereFature(OrderID)) 'sales'

FROM Orders

WHERE OrderDate BETWEEN '1996-01-01' AND '1996-12-31'

UNION ALL

SELECT 1997 as 'year',SUM(dbo.VlereFature(OrderID)) 'sales'

FROM Orders

WHERE OrderDate BETWEEN '1997-01-01' AND '1997-12-31'

-- te ndertojme nje funksion qe merr si argument

-- emrin e nje periudhe dhe dy data d1 dhe d2 qe kufizojne periudhen

-- funksioni kthen shitjet ne ate periiudhe

CREATE FUNCTION shitjetperiudhe(@periudha varchar(50),@dt1 as date, @dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT @periudha as 'periudha',SUM(dbo.VlereFature(OrderID)) 'shitje'

FROM Orders

WHERE OrderDate BETWEEN @dt1 AND @dt2

)

SELECT * from dbo.shitjetperiudhe('korrik 1996','1996-07-01','1996-07-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('gusht 1996','1996-08-01','1996-08-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('shtator 1996','1996-09-01','1996-09-30')

UNION ALL

SELECT * from dbo.shitjetperiudhe('tetor 1996','1996-10-01','1996-10-31')

UNION ALL

SELECT * from dbo.shitjetperiudhe('nentor 1996','1996-11-01','1996-11-30')

UNION ALL

SELECT * from dbo.shitjetperiudhe('dhjetor 1996','1996-12-01','1996-12-31')

SELECT 1997 'viti',shipcountry,SUM(dbo.VlereFature(oRDERId)) 'sales'

FROM Orders

WHERE OrderDate BETWEEN '1997-01-01' AND '1997-12-31'

group by ShipCountry

CREATE FUNCTION shitjetperiudheshtet(@periudha varchar(50),@dt1 as date, @dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT @periudha as 'periudha',shipcountry,SUM(dbo.VlereFature(OrderID)) 'shitje'

FROM Orders

WHERE OrderDate BETWEEN @dt1 AND @dt2

GROUP BY shipcountry

)

SELECT * from dbo.shitjetperiudheshtet('korrik','1996-07-01','1996-07-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('gusht','1996-08-01','1996-08-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('shtator','1996-09-01','1996-09-30')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('tetor','1996-10-01','1996-10-31')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('nentor','1996-11-01','1996-11-30')

UNION ALL

SELECT * from dbo.shitjetperiudheshtet('dhjetor','1996-12-01','1996-12-31')

-- funksion qe merr si argument kodin e punonjesit dhe kthen xhiron qe ka bere

CREATE FUNCTION xhiro(@punonjesi as int)

RETURNS money

AS

BEGIN

DECLARE @res as money

select @res=SUM(([Order Details].UnitPrice*[Order Details].Quantity))

from Orders INNER JOIN

[Order Details] ON Orders.OrderID=[Order Details].OrderID

where EmployeeID=@punonjesi

GROUP BY Orders.EmployeeID

return @res

END

-- libri i sshitjeve per nje periiudhe kohore midis dt1 dh dt2

-- te ndertojme nje funksion

CREATE FUNCTION LibriShitjeve(@dt1 as date,@dt2 as date)

RETURNS TABLE

AS

RETURN

(

SELECT OrderId 'FatureNr',OrderDate 'Date',CustomerID 'KodiKlientit',

dbo.CustomerName(CustomerID) 'Klienti',dbo.VlereFature(OrderID) 'Vlera'

FROM Orders

where OrderDate BETWEEN @dt1 AND @dt2

)

-- per librin e shitjeve te muajit korrik 1996

SELECT * FROM LibriSHitjeve('1996-07-01','1996-08-01')

-- TE NDERTOJME QUERY QE DO ISHTE ZEMRA E FUNKSIONIT E ME PAS DO TA PARAMETRIZOJME

-- ATE BRENDA FUNKSIONIT

SELECT OrderId 'FatureNr',OrderDate 'Date',CustomerID 'KodiKlientit',

dbo.CustomerName(CustomerID) 'Klienti',dbo.VlereFature(OrderID) 'Vlera'

FROM Orders

where OrderDate BETWEEN '1996-07-01' AND '1996-08-01'

CREATE FUNCTION CustomerName(@cid as char(5))

RETURNS varchar(50)

AS

BEGIN

declare @cn as varchar(50)

select @cn=companyname from Customers

where CustomerId=@cid

return @cn

END

-- ndertoni nje funksion tabele qe kthen listen e klienteve qe kane kryer

-- nje numer transaksionesh me te madh se n

CREATE FUNCTION CustByTrans(@transno as int)

RETURNS TABLE

AS

RETURN

(

SELECT * from customers

where CustomerId IN

(

SELECT CustomerID from Orders

group by CustomerID

HAVING count(*)>@transno

)

)

SELECT * from CustByTrans(10)

-- te ndertojme nje funksion qe kthen emrin,mbiemrin e punonjesit,

-- te paraprire nga titulli i kortezise

CREATE FUNCTION dbo.EmployeeName(@eid as INT)

RETURNS Varchar(100)

AS

BEGIN

DECLARE @emri as varchar(100)


SELECT @emri=(TitleOfCourtesy+' '+Firstname+' '+Lastname)

from Employees where EmployeeId=@eid


return @emri

END

-- te ndertojme nje funksion qe merr kodin e furnitorit dhe

-- kthen emrin e kompanise furnitore

CREATE FUNCTION dbo.SupplierName(@sid as INT)

RETURNS Varchar(100)

AS

BEGIN

DECLARE @emri as varchar(100)


SELECT @emri=CompanyName

from Suppliers where SupplierID=@sid


return @emri

END

SELECT dbo.Suppliername(2)

-- te krijojme nje funksion qe merr si argument kodin e produktit dhe kthen

-- emrin e produktit

CREATE FUNCTION emriproduktit(@kodi as int) returns varchar(100)

AS

BEGIN

Declare @emri as varchar(100)

SELECT @emri=productname from products

where productid=@kodi

return @emri

END

SELECT dbo.emriproduktit(7)

-- te krijojme nje funksion qe merr si argument kodin e kategorise dhe kthen

-- emrin e kategorise

CREATE FUNCTION emrikategorise(@kodi as int) returns varchar(100)

AS

BEGIN

Declare @emri as varchar(100)

SELECT @emri=categoryname from categories

where categoryid=@kodi

return @emri

END

-- te krijojme nje funksion qe merr si argument kodin e shippers dhe kthen

-- emrin e shippers

CREATE FUNCTION ShippersName(@kodi as int) returns varchar(100)

AS

BEGIN

Declare @posta as varchar(100)

SELECT @posta=CompanyName from Shippers

where ShipperID=@kodi

return @posta

END

-- Zgjidhja e Ushtrimit 4 me funksione

-- te ndertojme nje funksion qe merr si argument kodin e furnitorit dhe kthen

-- sa produkte blejme nga ai furnitor

-- te dhenat i kemi tek tabela products

SELECT * FROM Products

--te gjejme sa produkte blejme nga nje supplier psh supplierid=1

Select * from Products where SupplierID=1

-- ti numerojme keto rreshta me count(*)

Select COUNT(*) from

Products where SupplierID=1

-- ky query do te jete "ZEMRA" e funksionit

-- ku 1 do zevendesohet nga kodi i furnitorit @SUPID

-- dhe vlera qe kthen count(*) do te vendoset ne nje variabel INT @produkte

CREATE FUNCTION dbo.ProductsPerSupplier(@supid INT) RETURNS INT

AS

BEGIN

-- te deklarojme nje variabel ku do vendosim numrin e produkteve per furnitor

DECLARE @produkte AS INT

Select @produkte=COUNT(*) from

Products where SupplierID=@supid

RETURN @produkte

END

-- tani kthehemi tek u4

SELECT * from Suppliers

where dbo.ProductsPerSupplier(SupplierID)>2

-- tek ushtrimi 3. afishoni listen e klienteve me te mire , me xhiro pertej nje vlere te caktuar

--te ndertojme nje funksion xhiroklienti qe merr si argument kodin e klientit dhe kthen

-- xhironi financiare qe ai ka realizuar

-- perpara te arsyetoojme

-- informacioni per xhiron ndodhet ne Orders(customerid)

--dhe Order Details(vlera e faturave)

SELECT * from [Order Details]

select * from Orders

--na duhet te bejme JOIN midis dy tabelave per ti kombinuar

SELECT Orders.OrderID,Orders.CustomerID,UnitPrice,QUantity

FROM

ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

-- ta filtrojme kete rezultat vetem per nje klient psh VINET

SELECT Orders.OrderID,Orders.CustomerID,UnitPrice,QUantity

FROM

ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where CustomerID='VINET'

-- gjejme vleren finaciare per VINET

SELECT SUM(UnitPrice*Quantity)

FROM

ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where CustomerID='VINET'

-- ky query do jete "ZEMRA" e funksionit

-- me ndryshimin qe VINET do zevendesohet me @cid char(5) qe funksion e merr si argument

-- dhe vlera qe kthen SUM(UnitPrice*Quantity) do te vendoset ne nje variable

-- te tipit float psh @xhiro e cila do te ktheht nga funksioni

CREATE FUNCTIOn dbo.xhiroklienti(@cid as CHAR(5)) RETURNS float

AS

BEGIN

DECLARE @xhiro as float


SELECT @xhiro=SUM(UnitPrice*Quantity)

FROM

ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where CustomerID=@cid

RETURN @xhiro

END

-- ta provojme

SELECT dbo.xhiroklienti('VINET')

-- te zgjidhim problemin tone kliente me te mire me xhiro pertej nje vlere

SELECT dbo.xhiroklienti(customerid),*

FROM Customers

where dbo.xhiroklienti(customerid)>100000

order by dbo.xhiroklienti(customerid) DESC

-- USHTRIMI 2 . te afishojme punonjesit me te dalluar, mbi bazen e zhiros financiare

--te ndertojme nje funksion qe i japim kodin e punonjesit dhe na

--kthen xhiron financiare te punonjesit

-- informacioni mbi xhiron per nje kod punonjesi ndodhet ne dy tabelat order dhe order details

-- po bejme nje JOIN midis ketyre dy tabelabe

SELECT Orders.OrderID,Orders.EmployeeID,UnitPrice,Quantity

FROM ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

-- perqendrohemi tek nje punonjes psh punonjesi me kodin 5

SELECT Orders.OrderID,Orders.EmployeeID,UnitPrice,Quantity

FROM ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where EmployeeID=5

-- per te gjetur xhiron e punonjesit duhet te gjejme shumen e quantity*price per keta rreshta

SELECT SUM(UnitPrice*Quantity)

FROM ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where EmployeeID=5

-- kjo do te jete "ZEMRA" e funksionit

-- vetem se 5 do zevendesohet me @eid int, qe funksioni e merr si argument

-- dhe SUM(UnitPrice*Quantity) do te vendoset ne nje variabel te tipit floar

-- qe do te ktheje funksioni si vlere te xhiros se klientit

CREATE FUNCTION dbo.xhiropunonjesi(@eid AS INT) RETURNS float

AS

BEGIN

DECLARE @xhiro as float


SELECT @xhiro=SUM(UnitPrice*Quantity)

FROM ORDERS INNER JOIN [Order Details]

ON Orders.OrderID=[Order Details].OrderID

where EmployeeID=@eid


RETURN @xhiro

END

--ta provojme

SELECT dbo.xhiropunonjesi(1)

--OK

--tani te afishojme punonjesit me te mire

SELECT dbo.xhiropunonjesi(EmployeeID),*

FROM Employees

where dbo.xhiropunonjesi(EmployeeID)>10000

ORDER BY dbo.xhiropunonjesi(EmployeeID) DESC

Shembulli me funksionin tabele kompleks

-- te ndertojme nje funksion qe merr si argument 2 data

--@dt1 dhe @dt2

-- dhe kthen librin e shitjeve te kompannis ene kete periudhe

-- libri i shitjeve perbehet nga:

--kodi i porosisie,data,emri i punonjesit,emri i klientit

CREATE FUNCTION liber(@dt1 DATETIME, @dt2 DATETIME)

RETURNS @L TABLE

(

Kodi INT PRIMARY KEY,

Data DATETIME,

Punonjesi VARCHAR(50),

Klienti VARCHAR(50),

Vlera MONEY

)

AS

BEGIN

INSERT INTO @L(Kodi,Data,Punonjesi,Klienti,Vlera)

SELECT

Orders.OrderID,Orders.OrderDate,

FirstName+' '+LastName,

Customers.CompanyName,

SUM(UnitPrice*Quantity)

FROM Orders inner join [Order Details]

ON Orders.OrderID=[Order Details].OrderID

INNER JOIN Employees

ON Orders.EmployeeID=Employees.EmployeeID

INNER JOIN

Customers

ON Orders.CustomerID=Customers.CustomerID

WHERE OrderDate BETWEEN @dt1 and @dt2

GROUP BY

Orders.OrderID,Orders.OrderDate,

FirstName+' '+LastName,

Customers.CompanyName

RETURN

END

SELECT * FROM dbo.liber('1996-1-1','1997-1-1')

-- ushtrim

-- te afishojme xhiron per cdo shtet

-- ne nje periudhe te caktuar

--po fokusohemi ne dy data psh 1996-1-1 dhe 1997-1-1

-- ku eshte info per shtetet?

select * from Orders

-- per cdo porosi ruhet shteti ne kollonen ship country

-- ku eshte info per xhiron financiare?

select * from [Order Details]

select o.ShipCountry,

SUM(od.Quantity*od.UnitPrice) as xhiro

from Orders o

inner join

[Order Details] od

on o.OrderID=od.OrderID

where o.OrderDate

between '1996-1-1' and '1997-1-1'

group by ShipCountry

-- ta formuloje si nje funksion tabele

CREATE FUNCTION XhiroSipasShtetit

(

@dt1 date,

@dt2 date

)

RETURNS TABLE

AS

RETURN

(

select o.ShipCountry,

SUM(od.Quantity*od.UnitPrice) as xhiro

from Orders o

inner join

[Order Details] od

on o.OrderID=od.OrderID

where o.OrderDate

between @dt1 and @dt2

group by ShipCountry

)

select * from

dbo.XhiroSipasShtetit('1996-6-1','1997-1-1')

-- Ndertoni nje funksion tabele te thjeshte

-- qe merr si argument kodin e nje punonjesi

-- dhe kthen listen e punonjesve vartes te tij

CREATE FUNCTION shefi

(

@eid int

)

returns table

as

return

(

select * from Employees

where ReportsTo=@eid

)

select * from shefi(3)

-- JOIN I TABELES ME VETVHETEN

select e1.EmployeeID,e1.FirstName,e1.LastName,

e2.EmployeeID 'kodishefit',

e2.FirstName 'emrishefit',

e2.LastName 'mbiemrishefit',

COUNT(OrderID) 'Porosi'

from

Employees e1

inner join

Employees e2

on e1.ReportsTo=e2.EmployeeID

inner join

Orders o

on e1.EmployeeID=o.EmployeeID

where OrderDate between '1996-1-1' and '1997-1-1'

group by e1.EmployeeID,e1.FirstName,e1.LastName,

e2.EmployeeID,e2.FirstName,e2.LastName

------------------------------------------

print datepart(yy,'1996-1-1')

print datediff(dd,'1996-1-1','1997-1-1')

-- struktura programimi ne SQL

-- Te ndertojme nje funksionn

-- qe merr si argument nje numer te plote n

-- funksioni gjen dhe kthen shumen e n numrave te pare natyrore

CREATE FUNCTION shuma

(

@n as int

)

returns int

as

begin

declare @i as int -- deklarim i variablave

declare @s as int

set @i=1 -- vleredhenia

set @s=0

while(@i<=@n) -- cikel

begin -- bllok kodi

set @s=@s+@i

set @i=@i+1

end

return @s

end

print dbo.shuma(10)

print datepart(mm,'1996-1-2')

print datediff(mm,'1996-1-1','1997-1-1')

select OrderID,OrderDate from Orders

SHEMBULL - Afishoni lidhjet e nje punonjesi

ALTER FUNCTION lidhjet(@eid INT)

RETURNS @L TABLE

(

Nr INT Primary key identity(1,1),

Emri varchar(50),

Mbiemri varchar(50),

Kompania varchar(250),

Mardhenia varchar(50)

)

AS

BEGIN

INSERT INTO @L(Emri,Mbiemri,Kompania,Mardhenia)

select e1.FirstName,e1.LastName,'Northwind','Shefi Direkt'

from Employees e1

inner join employees e2

on e1.EmployeeID=e2.reportsto

where e2.EmployeeID=@eid

INSERT INTO @L(Emri,Mbiemri,Kompania,Mardhenia)

select e1.FirstName,e1.LastName,'Northwind','Vartes Direkt'

from Employees e1

where e1.ReportsTo=@eid

INSERT INTO @L(Emri,Mbiemri,Kompania,Mardhenia)

select ContactName,ContactName,

CompanyName,'Klient'

from Customers

where CustomerId IN

(

select distinct CustomerID

from Orders where EmployeeID=@eid

)

INSERT INTO @L(Emri,Mbiemri,Kompania,Mardhenia)

select ContactName,ContactName,

CompanyName,'Furnitor' from Suppliers

where SupplierID in

(

Select supplierID from Products

where productID IN

(

select DISTINCT ProductId from [Order Details]

WHERE

OrderId IN

(

SELECT OrderID from Orders Where EmployeeID=@eid

)

)

)

INSERT INTO @L(Emri,Mbiemri,Kompania,Mardhenia)

SELECT 'not available','not available',

CompanyName,'Shoqeri Transporti'

FROM Shippers

WHERE ShipperID IN

(

select DISTINCT ShipVia from orders

where EmployeeID=@eid

)

RETURN

END

Ushtrim - funksionet komplekse

Ndertoni nje funksion qe merr si argument shtetin dhe afishon shitjet qe jane realizuar ne ate shtet per vitet 1996,1997,1998. Shitjet do te jene ne formatin

Nr,Viti,Numri_i_Porosive,Xhiroja