+90 850 305 14 95 [email protected]

SQL Server üzerinde iş zekâsı çalışmalarımızın içinde çok önemli zaman harcadığımız bir süreçte raporlama aşamasıdır. Bir raporun başarısı istenilen çıktıyı görsel ve hızlı bir şekilde vermesine bağlıdır. Raporları hızlandırmanın en iyi yolu onları bir Küp veya ona benzer bir yapıdan çekmektir. Fakat bazen bunu yapamayız ve verimizi DataEngine üzerinden T-SQL ile çekmemiz gerekebilir. Bu durumda da sorgu performansınız büyük önem arz eder hale gelmekte. Çoğu rapor bünyesinde Aggregate fonksiyonlar ( SUM,AVG,MAX,…) barındırır. Bu fonksiyonlardaki veriminiz sorgu veriminizi direkt etkilemektedir.

Bu yazımızda bir çok raporda karşımıza çıkan Kümülatif Toplam ihtiyacını SQL Server 2012 üzerinde daha hızlı ve daha kolay nasıl çözeriz bunu göreceğiz. Birazdan göstereceğim yöntemler daha ortada yokken de T-SQL programcıları Kümülatif Toplam sorununu çözmekteydi. Kümülatif Toplam alabilmek için ortaya konulan bir çok yöntem vardı bunlardan bazılarını sıralarsak,

· Alt Sorgu

· Self Join

· Cursor

· Temp Table

· ……..

Yukarıda ki yöntemler hala geçerli ama SQL Server 2012 üzerinde 2 yeni ve hızlı seçeneğiniz var. OVER ifadesi Aggregate fonksiyonlar üzerinde kullanılabilen çok faydalı bir ifade. Bu ifade 2012 ile beraber çok daha yetenekli hale geldi.

1. Senaryoda sorgumuzun kaynağında ID gibi benzersiz bir alan olduğunda geçerlidir.

select TOP 5 SalesOrderID,OrderDate,

TotalDue,Sum(TotalDue) OVER (Order By SalesOrderID) as Toplam

from Sales.SalesOrderHeader

SalesOrderID OrderDate TotalDue Toplam

———— ———————– ——————— ———————

43659 2005-07-01 00:00:00.000 23153.2339 23153.2339

43660 2005-07-01 00:00:00.000 1457.3288 24610.5627

43661 2005-07-01 00:00:00.000 36865.8012 61476.3639

43662 2005-07-01 00:00:00.000 32474.9324 93951.2963

43663 2005-07-01 00:00:00.000 472.3108 94423.6071

(5 row(s) affected)

2. Senaryomuzda ise biraz daha farklı bir yöntem kullanacağım. Bu yöntemin benzersiz bir alana ihtiyacı yok.

select TOP 5 SalesOrderID,OrderDate,

TotalDue,Sum(TotalDue) OVER (Order By OrderDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Toplam

from Sales.SalesOrderHeader

SalesOrderID OrderDate TotalDue Toplam

———— ———————– ——————— ———————

43659 2005-07-01 00:00:00.000 23153.2339 23153.2339

43660 2005-07-01 00:00:00.000 1457.3288 24610.5627

43661 2005-07-01 00:00:00.000 36865.8012 61476.3639

43662 2005-07-01 00:00:00.000 32474.9324 93951.2963

43663 2005-07-01 00:00:00.000 472.3108 94423.6071

(5 row(s) affected)

Ortaya koyduğum bu 2 yöntem daha önceki yöntemlerden hem daha hızlı hem de daha kısa ve anlaşılır. Bir sonraki yazımda OVER ifadesine ve kullanımına detaylı bir şekilde değineceğim. Gerçekten şaşırtıcı yetenekleri var.