İnceleyeceğimiz fonksiyon bir dizi değer üzerinde hesaplamalar yapar. Şimdi birlikte nasıl kullanıldığını daha detaylı bir şekide öğrenelim.
İnceleyeceğimiz fonksiyon bir dizi değer üzerinde hesaplamalar yapar. Şimdi birlikte nasıl kullanıldığını daha detaylı bir şekide öğrenelim.
Not: Alan tanımlamalarda ve nesne isimlerinde (tablo, trigger, stored procedure) daime bitişik ve Türkçe karaktersiz kullanmaya alışkanlık haline getirmeliyiz select * from ziyaretcidefteri gibi ziyaretçi defteri tablosunun adını boşluk koyarak yazarsanız bu durumda sorguda select * from [ziyaretci defteri] yazmanız gerekir. Türkçe karakterli isimler ya da boşluklu nesne-alan isimleri kullanıldığında köşeli parantezler içerisinde isimleri belirtilmelidir. [no], [not], [ziyaretci defteri] gibi
CAST işlemleri
Aşağıdaki örneklerde Avg ile ortalama alındığında ortalama ondalıklı çıkabilir. Örnek olarak 50/7=7 değildir, 7.14 dür. Avg ise ondalıktan sonraki haneleri görmez o haneleri görmesi için Cast kullanılır
Avg(Cast(Notu as Numeric(4,2)))
noktadan sonra 2 karakter al.
Diğer Cast örnekleri
'Öğrencinin Notu' + CAST(notu AS nvarchar(3))
...WHERE CAST(satisfiyati AS char(20)) LIKE '3%'
...WHERE CAST(satisfiyati AS char(20)) LIKE '36%'
Aggregating (Aritmetiksel işlemler)
Max
select max(notu) from notlar
en yüksek öğrenci notu görüntülenir
Min
select min(notu) from notlar
en düşük öğrenci notu görüntülenir
Count
select count(notu) from notlar veya select count(all notu) from notlar
kayıt sayısını döndürür. Fakat notu alanı NULL değer içeriyosa o kaydı saymaz. NULL izni bu sebeplede mecbur kalmadıkça kullanılması istenmez.
select count(distinct adi+soyadi) from ogrenci
Kayıtları sayarken adi ve soyadi aynı olanları distinct ifadesi olduğu için bir kez sayar.
all ifadesi null lar hariç tüm kayıtları sayar, distinct ifadesi aynı kayıttan birden fazla var ise o kaydı sadece birkez sayar. Hiçbir şarta bağlı olmaksızın tamamını saydırmak için * karakteri kullanılır
select count(*) from ogrenci
Avg
select avg(notu) from notlar
notlar tablosundaki tüm notu kayıtlarının aritmetiksel ortalamasını alır. (NULL lar işleme tabi tutulmaz)
Sum
select sum(notu) from notlar
notlar tablosundaki notu alanına ait kayıtların toplamını verir.
Yukarıdaki 5 fonksiyon where ifadesiylede kullanılabilir
select min(notu) from notlar where ders='kimya'
select max(notu) from notlar where numara>100 and ders='kimya'
select sum(notu) as toplam,avg(notu) as ortalama, min(notu) as endusuk from notlar where ders='kimya'
Gruplandırma (group by)
Yukardaki ifadeler sadece tek satırlık sonuç döndürür. En son örnekte Kimya dersinin toplam,ortalama ve en düşük notları tek satır, 3 sütunla gösterilmektedir. 10 tane ders olduğunda her ders için ayrı ayrı select cümleciği where ders='dersadi' şeklinde yazmak yerine gruplandırma kullanılır.
Tüm derslerin ortalaması
select avg(notu) as ortalama, ders from notlar group by ders
ders ve ortalama sütunlarından oluşan ders sayısı kadar kayıt döndüren sorgudur.
select count(ders),avg(notu),ders from notlar group by ders
Yukarıdaki ile aynı. Her dersin ortalamasını, dersin adını, o dersle ilgili kayıt sayısını gösteren sorgudur
select avg(notu),numara from notlar group by numara
öğrenci numarasına göre herbir öğrencinin notlar ortalaması.
select avg(notu) as ortalama,numara,ders from notlar group by numara,ders
öğrencinin numara ve ders adına göre gruplandırarak her dersin herbir öğrenci ye ait ortalamlarını gösterir.
select max(notu),ders from notlar where numara>100 and ders='kimya' group by ders order by max(notu) desc
select max(notu),ders from notlar where numara>100 and ders='kimya' group by ders order by 1 desc
select ders,numara,avg(notu) as notu from notlar group by ders,numara
ders ve numara alanlarına göre kategorilenenmiş öğrenci ortalamalarınız gösterir.
öğrenci ortalamalarını ders ve numara alanlarına göre gruplasın gruplama sonucunda her derse ait en yüksek ortalamalı öğrenciyi versin
select ders,max(numara) numara ,max(notu) notu from(
select ders,numara,avg(notu) notu from notlar
group by ders,numara) as aaa group by ders
burada max(numara) kullanılması sonuç setinde numaranın yer alması içindir
Having
select * from ogrenci where yas>25 cümleciğinde where ifadesi ile yaşı 25 ten büyük olanlar listelenmektedir. Aritmetiksel fonksiyonlarda where ifadesi aritmetiksel fonksiyon içererek kullanılamaz. Örneğin select avg(notu) as ortalama,ders from notlar group by ders şeklinde bir sorgumuz olsun. Bu sorgu sonuç olarak dersleri ve o derslere ait ortalamaları verecektir. Ortalaması 50 den büyük öğrencilerin listesini almak için where avg(notu)>50 ifadesini kullanamayız. Bu durumda having kullanılır
select avg(notu) as ortalama,ders,numara from notlar group by ders,numara having avg(notu)>50
having kullanılarak aylık satışı 500 YTL nin altında olan çalışanlar listesi, ortalaması 50 nin altındaki öğrenciler gibi şartla beraber sum,avg,min,.... fonksiyonları kullanılabilir.
Genellikle Raporlamada kullanılan Veri Özetleme: Rollup ve Cube
Rollup (Ara Özet)
group by ifadesi ile kullanılır. Group by ile yanına yazılan alan ismine göre gruplama yapılır. rollup ise tüm kayıtlara göre hesaplama yapar. Alt toplam ve genel toplam sunar. Özet tablo sunar.
select avg(notu) ortalama,ders from notlar group by ders
Cümleciği her dersin ortalamasını verir. Okul ortalamasını almak için ise rollup ifadesi kullanılır
select avg(notu) ortalama,ders from notlar group by ders with rollup
en alt satırda ders adı kısmında NULL yazar, ortalama kısmında ise okul ortalaması yazar
NULL ifadesinin yazmaması için Grouping özelliği kullanılır
ders satırına case cümleciği ile grouping eklenir.
select
case when grouping(ders) = 1 then 'Okul Ortalaması'
else ders
end as ders,
avg(notu) ortalama from notlar
group by ders
with rollup
ifadesi ile ders alanı grouping ile satırların listelenmesinin bitip bitmediği kontrol edilir bitmedi ise else den sonra ders alınır, bitti ise =1 eşitliği sağlanır ve ders kısmına okul ortalaması yazar.
select avg(notu) ortalama,case when grouping(ders)=1 then 'Toplam' else ders end as ders,numara from notlar group by ders,numara with rollup
Her bir öğrencinin derslere göre gruplandırarak ders ortalamasını verir sonra ise rollup ifadesi olduğu için öğrencilerin o derslere ait ortalaması listelendikten sonra o derse ait okul ortalaması listelenir. En altta ise Genel okul ortalaması bulunur.
Cube (Alt Özet)
select avg(notu) ortalama,case when grouping(ders)=1 then 'Toplam' else ders end as ders,numara from notlar group by ders,numara with cube
yukarıdakinden te fark rollup yerine cube yazılmasıdır. bu durumda her öğrencinin derse ait ortalaması, o dersin okul ortalaması, öğrencinin tüm derslere ait ortalamalarıda listelenir.
Not: Rollup ve Cube 'de group by ile bir alanda gruplama yapılırsa aynı sonucu görürsünüz. Farkını anlamak için birden fazla alanda gruplama yapmak gerekir. Cube gruplamadaki tüm kombinasyonlara göre aggregating fonksiyonunu uygular. Rollup'ta ise group by daki sıraya göre özetleme sunar. Aşağıda 2 örnek vardır. numara ve ders alanlarının gruplama sırası farklıdır.
select avg(notu) ortalama,
case when grouping(ders)=1 then 'Toplam' else ders end as ders,
numara from notlar
group by ders,numara with rollup
select avg(notu) ortalama,
case when grouping(ders)=1 then 'Toplam' else ders end as ders,
numara from notlar
group by numara,ders with rollup
2. ifade numaraya göre ortalama verir (100 nolu öğrencinin tüm dersler ortalaması), en altta genel ortalama yer alır
1. ifadede ise dersler ortalamasını verir (Biyoloji dersinin tüm öğrencilere göre ortalaması). en altta ise genel ortalama yer alır
3 lü group by yapıldığında cube ve rollup arasındaki fark ne olur?