Toplama fonksiyonları ile birlikte ORDER BY deyimini kullanırken bazı dikkat etmemiz gereken noktalar vardır. Eğer toplama fonksiyonu olmayan bir sütunu ORDER BY ile listeleyeceksek, aynı kolonu GROUP BY kullanarak da listelememiz gerekir. Syntax yani söz dizimi olarak aşağıdaki gibidir :
SELECT Toplama Fonksiyonu(Kolon1Adı),kolon2 FROM tabloAdı GROUP BY kolon2 ORDER BY kolon2
Şimdi ORDER BY ile birlikte toplama fonksiyonunu kullanalım ve bu duruma dikkat etmediğimiz durumda ne gibi bir hata alıyoruz görelim. AdventureWorks2012 veritabanı üzerinde çalışıyorum.
SELECT CustomerID,SUM(TotalDue) AS TotalPerCustomer FROM Sales.SalesOrderHeader GROUP BY CustomerID ORDER BY TerritoryID;
Sorgum sonucunda aşağıdaki gibi bir uyarı mesajı alırım.
Msg 8127, Level 16, State 1, Line 2
Column “Sales.SalesOrderHeader.TerritoryID” is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
İşte bu hata ile karşılaşmamak için sorgum aşağıdaki gibi olmalıydı.
SELECT CustomerID, SUM(TotalDue) AS TotalPerCustomer FROM Sales.SalesOrderHeader GROUP BY CustomerID ORDER BY CustomerID
Bu sefer sorgumda CustomerID kolonu için hep GROUP BY hem de ORDER BY deyimini kullandım, sonuç :
SELECT TerritoryID, AVG(TotalDue) AS "Bölge Başına Ortalama" FROM Sales.SalesOrderHeader GROUP BY TerritoryID ORDER BY TerritoryID
Görüldüğü üzere Sales.SalesOrderHeader tablosunda TotalDue alanının ortalamasını TerritoryID değerine göre listeledim. Tabi burada toplamsal fonksiyon kullandığım için TerritoryID için ORDER BY ve GROUP BY dedim.
SELECT CustomerID, SUM(TotalDue) AS "Müşteri Başına Toplam" FROM Sales.SalesOrderHeader GROUP BY CustomerID ORDER BY SUM(TotalDue) DESC
Sales.SalesOrderHeader tablosunda TotalDue kolonunun CustomerID kolonuna göre toplamlarını azalan sıra ile (TotalDue kolonuna göre azalan sıra) listeliyoruz.