-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQL(Functions).sql
118 lines (80 loc) · 3.82 KB
/
SQL(Functions).sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
--User Defined Function
--Useru Defined Function'lar sorgu sonucunda dönen veri kümesi üzerinde kullanılabilinirler(select ). Biz bugüne kadar sql içerisinde gömülü olarak kullanılan
--fonksiyonları kullandık. Öenğin, DATEDIFF, Cast, Space vb. Bu fonksiyonlar sahip oldukları parametreler aracılığıyla kullanıcıdan
--gelen değerleri karşılamakta ve işlemler yaparak bize bir sonuç dönmekteydiler. Örneğin en sık kullanıdığımız DATEDIFF() fonksiyonu 3
--parametre almakta ve bize int tipinde bir sonuç dönmekteydi.UDF'ler ile biz kendi custom fonksiyonlarımızı yazabileceğiz.
--Fonksiyon kullanmamızdaki amaç yapılacak bir iş için yazılan tekrar kodlarını engelemektir. Örneğin bir işi handle etmek için 20 satır
--kod yazmamız gerekiyor ve bu iş için aynı kodları uygulamada 20 kez kullanmamız gerekmektedir. Bu süreç bize 400 koda mal olmaktadır.
--Ama bu süreci fonksiyon kullansaydık bu kodları bir kez yazıp onu ihtiyacımız olan yerde çağırsaydık bize daha temiz ve bakımı, onarımı
--daha kolay olan kod blokları ile süreç daha yönetilebilir bir hale gelirdi.
use Northwind
go
CREATE FUNCTION KDVHESAPLA(@fiyat money) /*Fonksiyonu oluşturacağımız için "Create Function" + Foksiyon ismi(Yaptığı göreve uygun bir isim) +*/
returns money -- geriye döndürülecek veri tipini belirtiyorum /* (@girilecek değer ismi + yapılmak istelinen işe ve değere uygun veri tipi )*/
begin
return @fiyat * 1.08
end
go
select ProductName,
CategoryName,
UnitPrice,
dbo.KDVHESAPLA(UnitPrice) as [KDV'Li Tutar]
from Products p
join Categories c on p.CategoryID = c.CategoryID
--Satışlardan elde eidlen geliri hespalarken kullandığımız formülü bir fonksiyona taşıyılam 2debir yazmayalım
go
CREATE FUNCTION SATIS(@miktar smallint, @birimfiyati money, @iskonto real)
RETURNS int
BEGIN
return @miktar * @birimfiyati * 1 - @iskonto
END
go
select OrderID,
SUM(DBO.SATIS(Quantity, UnitPrice, Discount)) as [SATIŞ]
from [Order Details]
group by OrderID
order by SATIŞ desc
--Tablo döndüren fonksiyonlar.
--Hangi ürünüm ne kadardan fazla satış almış , hangi ürün ilgi görmüş görebileceğimiz bir tablo yaratalım
go
CREATE FUNCTION CTGRYS (@miktar int)
returns Table
return
select p.ProductName,
cast(sum(od.Quantity * od.UnitPrice * (1-Discount)) as decimal) [Satıs]
from
Categories c join Products p
on c.CategoryID = p. CategoryID
join [Order Details] od
on od.ProductID = p.ProductID
Group By p.ProductName
Having sum(od.Quantity * od.UnitPrice * (1-Discount)) >= @miktar
go
select * from CTGRYS(10)--
--Kullanıcıdan alınana kategori bilgisine göre, ilgili kategori altındaki ürünlerin satışından ne kadar gelir elde etmişim?
go
CREATE FUNCTION GetCategoryBySold(@category_name varchar(max))
RETURNS TABLE
return select c.CategoryName,
sum(Quantity) as [Satılan Ürün Adedi],
(CAST(SUM(od.Quantity*od.UnitPrice*(1-od.Discount)) as decimal)) as [Toplam Satış]
from Products p
join [Order Details] od on od.ProductID = p.ProductID
join Categories c on c.CategoryID = p.CategoryID
group by c.CategoryName
having c.CategoryName = @category_name
go
select * from GetCategoryBySold('Beverages')
--Kullanıcıdan alınan çalışan isim ve soyisim bilgisine göre, ilgili çalışan ne kadar satış getçekleştirmiş
CREATE FUNCTION Soru1(@Fullname nvarchar(20))
RETURNS TABLE
Return select e.FirstName,
Cast(SUM(od.Quantity * od.UnitPrice * (1- Discount)) as decimal) as [Satış]
from
Employees e join Orders o
on e.EmployeeID = o.EmployeeID
join [Order Details] od
on od.OrderID = o.OrderID
Group By e.FirstName
having e.FirstName = @Fullname
select * from Soru1('Andrew')