-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQL(Aggragete Function Example).sql
193 lines (153 loc) · 7.29 KB
/
SQL(Aggragete Function Example).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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
--Aggragete Function Example
--1952 ile 1960 yılları arasında doğan çalışanlarımın adı ve soyadını tek bir sütunda, ünvanını ve doğum tarihini listeleyin
--Not: Employees tablosunda Birthdate bilgisi 1948-12-08 00:00:00.000 şekilnde tutulmuş. Buradan yıl bilgisini söküp almak için SQL içerisinde gömül olarak bulunan (built-in) Year() fonksiyonunu kullanacağız.
select EmployeeID,
(FirstName+' '+LastName) as [Full Name],
YEAR(BirthDate) as [Birth Year],
Title
from Employees
where YEAR(BirthDate) between 1952 and 1960
--Yaşı 60'dan büyük olan çalışanları listeleyiniz
--DateDiff() => Yaş hesaplarken kullanabileceğimiz bir built-in methodtur.
select (FirstName+' '+LastName) as [Full Name],
YEAR(BirthDate) as [Birth Year],
DATEDIFF("YY", BirthDate, GETDATE()) as Age
from Employees
where DATEDIFF("YY", BirthDate, GETDATE()) > 60
--Not: DATEDIFF() => Fonksiyonu içerisine parametre olarak verilen BirthDate ve GetDate() değerlerinden ilk parametre olarak verdiğimiz değere göre "YY" bilgisini alarak çıkartacak.
select GETDATE() -- System saatini yani bize anı teslim eder
--Çalışanların Id'si 2 ile 5 arasında olan kullanıcıları FirstName'lerine göre a'dan z'ye sıralayınız
select (FirstName+' '+LastName) as [FullName],
Title,
DATEDIFF("YY", BirthDate, GETDATE()) as Age
from Employees
where EmployeeID between 2 and 5
order by FirstName asc --Not: Order by ile asc kullanmaya gerek yoktur. Çünkü order by deyiminin varsayılan (default) değeri "asc"dir.
--Aggragete Function
--Sum() => İçerisine parametre olarak verilen değeri toplar
select Sum(EmployeeID) as [Id'lerin Toplamı] from Employees
--Toplam stok durumu nedir?
select Sum(UnitsInStock) as [Total Stock] from Products
--Order Details tablosundan faydalanarak, siparişlerin toplam tutarı
select Sum(Quantity * UnitPrice * (1 - Discount)) from [Order Details]
--Çalışanların yaşlarının toplamı
select SUM(DATEDIFF("YY", BirthDate, GetDate())) as [Total Age] from Employees
--Count() => Sorgu sonucunda dönen veri kümesinin satır sayısını sayar
select COUNT(*) as [Toplam Çalışan Sayısı] from Employees
--Toplamda kaç sipariş gerçekleştirmişim (Order)
select COUNT(OrderId) from Orders
--Kaç farklı şehirde oturan çalışanım var
select Count(distinct City) from Employees
--Not: "distinct" anahtar sözcüğü ile count fonksiyonu içeriisnde kullanılan parametredeki sütun içerisinde ki tekrar eden satırları görmezden gelir.
--Uyarı: Count() fonksiyonunu kullanırken çok dikkatli olmalıyız. Şayet Count içerisine vereceğimiz parametrede tekrar eden değerler var ise çok yanlış sonuçlar elde edebiliriz.
--Average() => Ortamayı hesaplar
--Çalışanların yaşlarının ortalamasını bulalım
select Avg(DATEDIFF("YY", BirthDate, GETDATE())) from Employees
--Siparişleirmden elde ettiğim gelirin ortalaması
select Cast(Avg(Quantity * UnitPrice * (1 - Discount)) as smallmoney) from [Order Details]
--Min() & Max()
select Min(UnitsInStock) from Products
select Max(UnitsInStock) from Products
--En genç çalışan ve En yaşlı çalışanı bulun
select Min(DATEDIFF("YY", BirthDate, GETDATE())) as [En Küçük Çalışan],
MAX(DATEDIFF("YY", BirthDate, GetDate())) as [En Büyük Çalışan] from Employees
--Group By: Sorgu sonucunda dönen veri kümesi üzerinde gruplama işlemleri yapmka için kullanılır. Aggregate function kullanıldığında select alaında birdan fazla sütun varsa sorgu sonucunda bu sütunlardan herhangi birine göre gruplama yapmak gerekmektedir. Burada ki düşünce mantığımızı şöylede kurabiliriz. Group by kullandığımda verdiğim parametreyi select alanında da kullanmalıyım.
--hangi category altında kaç ürünüm var
select CategoryID,
COUNT(*) as Adet
from Products
group by CategoryID
select ProductID, CategoryID, ProductName from Products where CategoryID = 1
--UnitPrice 35'den büyük olan kaç tane ürünüm var ve bu ürünleri Categorilerine göre gruplayınız
select CategoryID,
COUNT(*) as Adet -- burada count her bir CategoryId için çalışacak
from Products
where UnitPrice > 35
group by CategoryID
--Her bir siparişten ne kadar para kazanmışım? (Her siparişin tutarına göre gruplayınız)
select OrderID,
Sum(Quantity * UnitPrice * (1- Discount)) as [Sipariş Tutarı] -- burada aggregate function her bir orderıd için çalışacak
from [Order Details]
group by OrderID
order by [Sipariş Tutarı] desc
--Ürün baş harfi A-K aralığında olan, stok bilgisi 5 ile 50 arasında olan ürünleri kategorilerine göre gruplayınız. Elde edilen adet sayısına göre çoktan aza sıralayınız
select CategoryID,
Count(*) as Adet
from Products
where (ProductName like '[A-K]%') and
(UnitsInStock between 5 and 50)
group by CategoryID
order by Adet Desc
select CategoryID,
Count(*) as Adet
from Products
where (ProductName between 'A%' and 'K%') and
(UnitsInStock between 5 and 50)
group by CategoryID
order by Adet Desc
--Ingilterede oturan kadınların, adı , soyadı birleştirerek, ünvanı, ülkesi, doğum tarihini listeliyinz
select EmployeeID,
(FirstName+SPACE(1)+LastName) as [Full Name],
Title,
TitleOfCourtesy
from Employees
where (Country = 'UK')
and
(TitleOfCourtesy = 'Mrs.' or TitleOfCourtesy = 'Ms.')
and
(FirstName like 'A%')
--Unvanı Mr. olanlar veya yaşı 60'tan büyük olanların, Id, Adı, Soyadı, Doğum Tarihi, ünvanı bilgilerini getirin
select (TitleOfCourtesy+SPACE(1)+FirstName+SPACE(1)+LastName) as [Full Name],
(
Cast(YEAR(BirthDate) as varchar)
+'.'+
Cast(MONTH(BirthDate) as varchar)
+'.'+
Cast(DAY(BirthDate) as varchar)
) as [Birth Date]
from Employees
where (TitleOfCourtesy = 'Mr.')
or
(DATEDIFF("YY", BirthDate, GETDATE()) > 60)
--Region bilgisi olmayan çalışanları listeleyin
select * from Employees where Region is null
--Alfabetik olarak Janet ve Robert arasında olan çalışaçanları listeleyin
select FirstName,
LastName
from Employees
where FirstName between 'Janet' and 'Robert'
order by FirstName
--Fosil olan çalışalı bulalım
select Top 1 FirstName+SPACE(1)+LastName as [Full Name],
YEAR(BirthDate) as Age
from Employees
order by Age asc
--Hangi ülkede kaç çalışalım var
select Country,
COUNT(*) as [Employee Count]
from Employees
--where Country is not null -- çalıştığımız tabloda null alanlar varsa muhakak bu where mantığıda düşünülmelidir
group by Country
--Having
--Sorgu sonucunda dönen veri kümesi üzerinde Aggreagete Fonksiyonlara bağlı olarak filtreleme işlemlerinde kullanılır. Şayet sorguda aggregate function yoksa where kullanılabilinir. Aggregate function sonucunda dönen veri kümesi üzerinde filtreleme için where kullanılamaz.
--Hangi category altındaki ürünlerin stok miktarıları 400'ün altındadır
select CategoryID,
Sum(UnitsInStock) as [Stock]
from Products
group by CategoryID
having Sum(UnitsInStock) < 400
order by Stock desc
--Her bir siparişteki toplam ürün sayısı 200 üzerinde olan siparişleri listeleyiniz
select OrderID,
Sum(Quantity) as [Total Product]
from [Order Details]
group by OrderID
having Sum(Quantity) > 200
order by [Total Product] desc
--Toplam Tutarı 2500 ile 3500 arasında olan siparileri sıralayalım
select OrderID,
Cast(Sum(Quantity * UnitPrice * (1 - Discount)) as decimal) as [Total Income]
from [Order Details]
group by OrderID
having Sum(Quantity * UnitPrice * (1 - Discount)) between 2500 and 3500
order by 2 desc