SQL Server ile En Çok Satış Yapan Personeli Stored Procedure ile Bulmak
Aslında bu örneği yaparken, acaba ağır olur mu diye biraz düşündüm. Ama ileri seviye örnekler koymanın da gerektiğini düşündüm. Zira birçok sitede temel seviye örnekler zaten var. Excel'de Pivot tablolarla yaptığımız bir işlemi şimdi burada yapmaya çalışalım.
Bir satış tablomuz(tblsatis) olduğunu düşünelim, şirketteki personellerin yaptıkları satışlar bu tabloda yer alsın. Ayrıca bir de personel tablomuzun (tblpersonel) olduğunu düşünelim, şirketimizdeki tüm personeller de bilgileriyle bu tabloda yer alsın. Personellerin yaptıkları tüm satışlar MIKTAR olara tblsatis tablosunda yer alıyorsa, personelleri yaptıkları satışlara göre sıralamak istiyoruz. En çok satış yapan personele de ödül vermek istiyoruz. Nasıl yaparız?
tblpersonel Tablosu Yapısı

tblsatis Tablosu Yapısı

tblsatis Tablosu Verileri

.jpg)
Klasik SQL ile en çok satış yapılan Toplam Miktarı aşağıdaki yöntemlerden biriyle bulabilirsiniz.
Bir satış tablomuz(tblsatis) olduğunu düşünelim, şirketteki personellerin yaptıkları satışlar bu tabloda yer alsın. Ayrıca bir de personel tablomuzun (tblpersonel) olduğunu düşünelim, şirketimizdeki tüm personeller de bilgileriyle bu tabloda yer alsın. Personellerin yaptıkları tüm satışlar MIKTAR olara tblsatis tablosunda yer alıyorsa, personelleri yaptıkları satışlara göre sıralamak istiyoruz. En çok satış yapan personele de ödül vermek istiyoruz. Nasıl yaparız?
tblpersonel Tablosu Yapısı

tblsatis Tablosu Yapısı

tblsatis Tablosu Verileri

.jpg)
Klasik SQL ile en çok satış yapılan Toplam Miktarı aşağıdaki yöntemlerden biriyle bulabilirsiniz.
Yöntem 1:
SELECT TOP (1) MAX(SUM(MIKTAR)) OVER ()
FROM tblsatis
GROUP BY personelID
Yöntem 2:
SELECT MAX(t1.SATISTOPLAM) from
(SELECT SUM(MIKTAR) AS SATISTOPLAM
from tblsatis GROUP BY personelID
) AS t1
Peki aynı zamanda Satış Miktarı Toplamı bulup, bu kişiyi Ad ve Soyadı bilgisiyle getirebilir misiniz? Bu işlemi yapmak için bir Stored Procedure yazmak gerekli diye düşündüm, tıpkı bir matematik problemi gibi bu problemin de birden fazla çözümü olabilir.
Aklıma gelen ilk yol döngü içinde tüm personelleri dolaşıp birincil anahtar olan personelID değerine göre tblsatis tablosundan toplam aldırmak. Toplamların içinden de en büyük değeri bulmak için @maxsatis isminde bir değişken tanımlamak ve @maxsatis degiskenini kendisinden büyük bir değerle karşılaştığında güncellemek. @maxsatis'i güncellerken o an hangi personelin numarası üzerinde işlem yaptığımızı da @pno değişkeninde tutuyoruz.
Aklıma gelen ilk yol döngü içinde tüm personelleri dolaşıp birincil anahtar olan personelID değerine göre tblsatis tablosundan toplam aldırmak. Toplamların içinden de en büyük değeri bulmak için @maxsatis isminde bir değişken tanımlamak ve @maxsatis degiskenini kendisinden büyük bir değerle karşılaştığında güncellemek. @maxsatis'i güncellerken o an hangi personelin numarası üzerinde işlem yaptığımızı da @pno değişkeninde tutuyoruz.
CREATE PROC sp_maksimum_satis AS
BEGIN
DECLARE @max int, @i int, @pno int, @maxpno int;
DECLARE @adi VARCHAR(50), @soyadi VARCHAR(50);
DECLARE @satis decimal(15,2), @maxsatis decimal(15,2);
SET @satis=0;
SET @maxsatis=0;
SELECT @max= MAX(personelID) FROM tblpersonel;
SELECT @i= MIN(personelID) FROM tblpersonel;
WHILE (@i<=@max)
BEGIN
SELECT @satis=SUM(MIKTAR),@pno= personelID from tblsatis WHERE personelID=@i GROUP BY personelID;
if (@satis>0)
BEGIN
if (@satis> @maxsatis)
BEGIN
SET @maxsatis=@satis;
SET @maxpno= @pno;
END
END
SET @i=@i+1;
END
SELECT @adi=ADI, @soyadi=SOYADI FROM tblpersonel WHERE personelID=@maxpno;
PRINT @adi+' '+ @soyadi+' '+ convert(varchar, @maxsatis);
END
Yukarıdaki stored procedure'ü yani Türkçesiyle saklı yordamı aşağıdaki gibi çalıştırabilirsiniz. Sonuç ortada, daha fazla anlatmaya gerek yok.

Yukarıdaki stored procedure'ü yani Türkçesiyle saklı yordamı aşağıdaki gibi çalıştırabilirsiniz. Sonuç ortada, daha fazla anlatmaya gerek yok.

Çözüm 2:
,
Peki bu problemi hiç Stored Procedure(Saklı Yordam) kullanmadan klasik SQL komutlarıyla çözebilir miyiz? Cevabı aşağıdaki SQL kodlarından inceleyebilirsiniz. Burada TOP 1 ile gelen kayıt kümesinden en üstte gelen bir tanesini alıyoruz, bu komut T-SQL'e özgü bir komuttur. Farklı veritabanlarından TOP yerine farklı komutlar kullanılır. Ardından SQL'deki gruplama fonksiyonlarından SUM fonksiyonu ile MIKTAR alanını topluyoruz ve bunu SATISTOPLAM değişkenine(burada Alias deniyor) atıyoruz. SUM kullandığımız için GROUP BY dedikten sonra nasıl gruplanacağını belirtiyoruz, burada GROUP BY'dan sonra ADI, SOYADI geldiğinine dikkat ediniz. Çünkü dönecek veri kümesindeki personelin ADI ve SOYADI bilgisine göre gruplandırmasını istiyoruz. Sıralamayı büyükten küçüğe yapması için ORDER BY kalıbından sonra SATISTOPLAM DESC kullanıyoruz.
SELECT TOP 1 p.ADI, p.SOYADI, SUM(s.MIKTAR) AS satistoplam
FROM tblpersonel p, tblsatis s
WHERE s.personelID= p.personelID
WHERE s.personelID= p.personelID
GROUP BY p.ADI, p.SOYADI
ORDER BY satistoplam DESC
Yukarıdaki SQL kodunu SQL Server Enterprise Manager içinde çalıştırdığımızda aaşğıdaki sonucu elde ederiz.
ORDER BY satistoplam DESC
Yukarıdaki SQL kodunu SQL Server Enterprise Manager içinde çalıştırdığımızda aaşğıdaki sonucu elde ederiz.

SQL Server kategorisinden diğer örnekleri görebilirsiniz, yenileri de gelecek. Hergün farklı sorularla karşılaşıyorum, çözüp fırsat buldukça buraya yazmaya çalışıyorum. Aşağıdaki örnekler de ilginizi çekebilir.
SQL nedir, Temel SQL Komutları nelerdir?
SQL Server'da Gruplama Fonksiyonları
SQL Dilinde İki Tabloyu Birleştirerek Sorgulama
SQL Server ile Gruplama Fonksiyonu Örnekleri
SQL Server ile Gruplama Fonksiyonu Örnekleri-2
SQL Server ile Stored Procedure Oluşturma Giriş
SQL Server ile sırayla Artan Stored Procedure Yazma
SQL Server altındaki T-SQL ile Döngü İşlemleri
SQL Server'da Gruplama Fonksiyonları
SQL Dilinde İki Tabloyu Birleştirerek Sorgulama
SQL Server ile Gruplama Fonksiyonu Örnekleri
SQL Server ile Gruplama Fonksiyonu Örnekleri-2
SQL Server ile Stored Procedure Oluşturma Giriş
SQL Server ile sırayla Artan Stored Procedure Yazma
SQL Server altındaki T-SQL ile Döngü İşlemleri
SQL Server ile En Çok Satış Yapan Personeli Stored Procedure ile Bulmak
Stored Procedure kullanarak Asp.net ile SQL Server ile tablosuna kayıt eklemek
SQL Server'da Şema ve Veri Scripti Oluşturma
MySQL'de Veritabanı ve Tablo OluşturmaStored Procedure kullanarak Asp.net ile SQL Server ile tablosuna kayıt eklemek
SQL Server'da Şema ve Veri Scripti Oluşturma
MySQL Veritabanında Parametreli Stored Procedure oluşturma
MySQL Veritabanında Parametresiz Stored Procedure Oluşturma
Mutlu kodlamalar,
Oğuzhan TAŞ
Mart, 2018

Dil Değiştir(Change Language)
Kategoriler
- Csharp(58)
- Csharp Formlar(23)
- Web Tasarım(9)
- CSS(27)
- JavaScript(37)
- PHP(50)
- Laravel(3)
- ASP.net(38)
- Excel(15)
- Güvenlik(4)
- E-Ticaret(3)
- Kariyer(5)
- SQL Server(29)
- MySQL(16)
- Linux(17)
- MacOSX(8)
- Ayarlar(12)
- Bilgisayar Ağları(3)
- Symfony(1)
- Teknoloji(7)
- VBS(1)
- Arduino(6)
- RaspberryPi(1)
- Algoritmalar(15)
- HTML(3)
- Python(2)
- Bash Script(7)
- C Programlama(10)
- Flutter - Dart(11)
- Bootstrap(1)
En çok Okunan 18 Makale
- :: Excelde EĞER Fonksiyonu Kullanımı...
- :: Csharp ile Access Veritabanı Bağlan...
- :: SQL nedir, Temel SQL Komutları nele...
- :: Hangi Linux Dağıtımı?
- :: OSX İşletim Sistemine PHP, MySQL, A...
- :: Excel Hesap tablosunda EĞERSAY Fonk...
- :: PHP dilini kullanarak MySQLi tekniğ...
- :: Excel Hesap tablosunda ÇOKETOPLA Fo...
- :: Excel Hesap tablosunda ETOPLA Fonks...
- :: Excel Hesap tablosunda ÇOKEĞERSAY F...
- :: Hangi Programlama Dilini Öğrenmeliy...
- :: Mac Bilgisayarınıza Windows 7 Yükle...
- :: PHP ile Basit Dosya Yükleme
- :: Excel hücrelerinde yıldız koyarak b...
- :: C# Programlama Dili ile İlgili Örne...
- :: PHP Dili kullanarak MySQLi Tekniği ...
- :: PhpMyAdmin Şifresi Nasıl Değiştiril...
- :: Hangisi acaba, PHP mi ASP.NET mi ?