Anasayfa / Yazılım / SQL / Toplama Fonksiyonları Uygulamaları

Toplama Fonksiyonları Uygulamaları

Toplama fonksiyonlarının sorgu içinde toplama fonksiyonu olmayan kolonların sorgulanması hususunda bir kaç örnek yaparak yazıyı sonlandıralım. AdventureWorks veritabanı üzerinde örnek yapıyorum.

1) HumanResources.Employee tablosu ile Person.Person tablosunu birleştirerek her bir çalışan için FirstName, LastName, ve HireDate alanlarını listeleyelim. Burada her bir JobTitle için çalışan sayılarını toplama fonksiyonumda kullanacağım. Bunu yapabilmek içinde türetilmiş tablo kullanacağım.

SELECT FirstName, LastName, Calisan.JobTitle, HireDate, CountOfTitle 
FROM HumanResources.Employee AS Calisan INNER JOIN Person.Person AS Kisi
ON Calisan.BusinessEntityID = Kisi.BusinessEntityID INNER JOIN
(SELECT COUNT(*) AS CountOfTitle, JobTitle FROM HumanResources.Employee GROUP BY JobTitle) AS Unvan 
ON Calisan.JobTitle = Unvan.JobTitle;

2013040102

2) Şimdi üstte yer alan sorguyu bu seferde CTE ile oluşturalım.

WITH Unvan AS (SELECT COUNT(*) AS CountOfTitle, JobTitle FROM HumanResources.Employee
GROUP BY JobTitle) SELECT FirstName, LastName, Calisan.JobTitle, HireDate, CountOfTitle
FROM HumanResources.Employee AS Calisan INNER JOIN Person.Person AS Kisi 
ON Calisan.BusinessEntityID = Kisi.BusinessEntityID INNER JOIN Unvan 
ON Calisan.JobTitle = Unvan.JobTitle;

Sonuç olarak aynı sonucu alırım.

2013040102

3) Şimdi üstte yer alan sorguyu bu seferde OVER ile oluşturalım.

SELECT FirstName, LastName, Calisan.JobTitle, HireDate, COUNT(*) 
OVER(PARTITION BY JobTitle) AS CountOfTitle FROM HumanResources.Employee AS Calisan
INNER JOIN Person.Person AS Kisi ON Calisan.BusinessEntityID = Kisi.BusinessEntityID;

Sonuç olarak aynı sonucu alırım.

2013040102

4) En az 3 siparişe sahip her bir müşteri için Sales.SalesOrderHeader tablosundaki her satıra karşılık CustomerID, SalesOrderID ve OrderDate kolonlarını listeleyelim. Bu sorguyu alt sorgu, türetilmiş tablo ve CTE olmak üzere 3 şekilde oluşturalım.

Alt Sorgu kullanarak :

SELECT CustomerID, SalesOrderID, OrderDate FROM Sales.SalesOrderHeader 
WHERE CustomerID IN (SELECT CustomerID FROM Sales.SalesOrderHeader 
GROUP BY CustomerID HAVING COUNT(*) > 2);

CTE kullanarak :

WITH Musteri AS (SELECT CustomerID FROM Sales.SalesOrderHeader GROUP BY CustomerID
HAVING COUNT(*) > 2) SELECT Musteri.CustomerID, SalesOrderID, OrderDate 
FROM Sales.SalesOrderHeader AS SatisSiparisBaslik 
INNER JOIN Musteri ON SatisSiparisBaslik.CustomerID = Musteri.CustomerID;

Türetilmiş tablo kullanarak :

SELECT Musteri.CustomerID, SalesOrderID, OrderDate FROM Sales.SalesOrderHeader
AS SatisSiparisBaslik INNER JOIN (SELECT CustomerID FROM Sales.SalesOrderHeader
GROUP BY CustomerID HAVING COUNT(*) > 2) AS Musteri 
ON SatisSiparisBaslik.CustomerID = Musteri.CustomerID;

Her 3 yöntemde de sonuç aynıdır.

2013040103

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir