Bu yazımda bazı toplama fonksiyonu uygulanmış kolonlar ile birlikte toplama fonksiyonu uygulanmamış olan kolonların görüntülenmek istediğinde ne yapabiliriz buna değinmek istiyorum. Yapacağımız uygulama tüm sonuçları listeleme içinde büyük boyutlu bir dizi setini listeleme içinde aynıdır. Örneğin Sales.SalesOrderHeade tablosunda farklı bir kaç sütunu listelemek ile birlikte, tüm satışları baz alarak her bir satış için TotalDue alanının yüzdesini hesaplamak istiyorum. Eğer ben bu oluşturmak istediğim sorguda CustomerID alanına göre gruplama yaparsam ve diğer durumları dikkate almazsam, Sales.SalesOrderHeader tablosundan toplama fonksiyonu uygulanmamış olan kolonları dahil etmemiş olurum. Bu sorunu aşabilmek için türetilmiş tablo yada CTE kullanmam gerekir.
Öncelikle türetilmiş tablo ile bunu nasıl yaparız görelim :
SELECT Musteri.CustomerID, SalesOrderID, TotalDue, OrtalamaTotalDue, TotalDue/ToplamTotalDue * 100 AS SatisYuzdesi FROM Sales.SalesOrderHeader AS SatisSiparisBaslik INNER JOIN (SELECT CustomerID, SUM(TotalDue) AS ToplamTotalDue, AVG(TotalDue) AS OrtalamaTotalDue FROM Sales.SalesOrderHeader GROUP BY CustomerID) AS Musteri ON SatisSiparisBaslik.CustomerID = Musteri.CustomerID ORDER BY Musteri.CustomerID;
CTE ile yaparsak :
WITH Musteri AS (SELECT CustomerID, SUM(TotalDue) AS ToplamTotalDue, AVG(TotalDue) AS OrtalamaTotalDue FROM Sales.SalesOrderHeader GROUP BY CustomerID) SELECT Musteri.CustomerID, SalesOrderID, TotalDue, OrtalamaTotalDue, TotalDue/ToplamTotalDue * 100 AS SatisYuzdesi FROM Sales.SalesOrderHeader AS SatisSiparisBaslik INNER JOIN Musteri ON SatisSiparisBaslik.CustomerID = Musteri.CustomerID ORDER BY Musteri.CustomerID;
Görüleceği üzere sonuçlar aynı, sadece sorgu teknikleri farklı. Türetilmiş tablo ve CTE’de gruplama CustomerID alanına göre yapılmıştır. Dış sorgu herhangi bir gruplama içermiyor ve her kolon kullanılabiliyor. Bu iki teknikte ilişkili alt sorgu ile oluşturulan tekniklerden çok daha performanslıdır.