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;
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.
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.
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.