Salı , 19 Haziran 2018

T-SQL ile Gruplanan Değerlerin Çarpılması

Group By operatörünü kullanarak Sum, Count, Min ve Max gibi Aggregation(Gruplama) fonksiyonlarını kullanabiliyoruz. Fakat bazı durumlarda gruplanacak değerlerin Sum gibi bir fonksiyon ile toplanması değil değerlerin çarpılması şeklinde gruplanması gerekebiliyor. Bu ihtiyacı karşılayacak herhangi bir SQL Server built-in fonksiyonu da maalesef henüz SQL Server kütüphanesinde yok. Böyle bir ihtiyaç için bir tane Aggregation fonksiyonu olmamasına rağmen gruplanacak değerlerin çarpılması işlemi aslında basit bir matematiksel işlemle çözülebilir. Matematiksel hesaplamalarda iki değerin çarpılması işlemi o değerlerin logaritmik ifadelerinin toplanmasının Anti logaritmik hali olarak ifade edilebilmektedir. Yani kısaca formulize edecek olursak çarpma işlemini aşağıdaki gibi ifade edebiliriz.
x * y = Anti-Logaritma ( logaritma (x) + logaritma (y) )
Yukarıdaki formülizasyonu göz önüne aldığımızda SQL Serverın bize sunmuş olduğu logaritma alan LOG, Anti-Logaritmik işlem için kullanılan EXP fonksiyonları ile SUM fonksiyonu bizim işimizi görecektir. Hemen bir örnekle konuyu daha detaylı açıklayalım. İlk adım olarak aşağıdaki gibi örnek tablomuzu oluşturalım.
CREATE TABLE #Sonuc(OyunAd VARCHAR(100),Oran INT)

INSERT INTO #Sonuc VALUES('Futbol',3)

INSERT INTO #Sonuc VALUES('Futbol',6)

INSERT INTO #Sonuc VALUES('Futbol',2)

INSERT INTO #Sonuc VALUES('Basketbol',7)

INSERT INTO #Sonuc VALUES('Basketbol',4)

INSERT INTO #Sonuc VALUES('Basketbol',5)

INSERT INTO #Sonuc VALUES('Voleybol',8)

INSERT INTO #Sonuc VALUES('Voleybol',2)


SELECT * FROM #Sonuc 

 Yukarıdaki tablomuzda oyun adına göre oranlarımızı hem toplayalım hem de çarpalım.

SELECT OyunAd, SUM(Oran) as Toplam,EXP(SUM(LOG(Oran))) as Carpim
FROM #Sonuc
GROUP BY OyunAd

 Yukarıdaki resimde de gördüğümüz gibi oyun adı bazında değerlerin çarpımlarını elde edebilmek için EXP(SUM(LOG(Oran))) ifadesini kullanmamız yeterli oldu.

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>