Kümül toplam için hep cursor(dataset,recordset) açardım, keşfettiğim bu yöntemle artık kümül toplam almak çok bir basit SQL cümlesi.
Evet arkadaşlar benim her zaman kabusum olmuştur ve hiç sevmediğim bir iştir kümül toplam almak. Bunu yöneticilerin garip isteklerini yerine getirmek için bir çok defa yapmışımdır. Geçen gün yine aynı istek gelince Stored Procedure yazmak, yada ön yüzde (Dataset,Recordset) açmak yerine bir SQL ile o SQL cümlesini de direkt rapora vererek bu işi çözdüm. İşte çözüm:
Bir tablomuz (yada view) olsun bu tabloada şu alanlar olsun:
HesapKodu
GrupKodu
AnaGrupKodu
Ay_Kodu
Ay_TolamTutar
Ay_Kodu'na gelecek değerlerde alfanumerik sıralamaya dikkat etmemiz gerekiyor. Aslolarak Ocak Şubattan sonra geliyor. Aynı şekilde buraya yazılan Ay kodu da sıralandığında bildiğimiz ay sıralamasının dışına çıkmamalı. Bu yüzden Ay_Kod = "YYYY_MM" olarak getirilmeli.
Veriler şöyle olsun:
HesapKodu GrupKodu AnaGrupKodu Ay_Kodu Ay_TolamTutar
120.01.01 Grp0001 AnaGrup001 2007_01 100
120.01.01 Grp0001 AnaGrup001 2007_02 250
120.01.01 Grp0001 AnaGrup001 2007_03 300
120.01.01 Grp0001 AnaGrup001 2007_04 550
120.02.02 Grp0002 AnaGrup001 2007_02 75
Şimdi kümül SQL'i yazalım:
SELECT t1.HesapKodu, t1.GrupKodu, t1.AnaGrupKodu, t1.Ay_Kodu,
Ay_KumulTutar = ISNULL(t1.Ay_TolamTutar,0)
+ ISNULL(SUM(CASE
WHEN t1.Ay_Kod > t2.Ay_Kod THEN t2.Ay_TolamTutar
ELSE 0
END),0)
FROM V_Hesap_Toplamlari_Aylik t1
INNER JOIN V_Hesap_Toplamlari_Aylik t2
ON t1.HesapKodu = t2.HesapKodu AND
t1.GrupKodu = t2.GrupKodu
GROUP BY t1.HesapKodu, t1.GrupKodu, t1.AnaGrupKodu, t1.Ay_Kodu, t1.Ay_TolamTutar
Evet, görüldüğü üzere bu kadar basit, hani daha önce neden düşünemedim diyeceğiniz tarzda. Kümül toplam Case içinde hallediliyor. Ancak bu kodun ne yazık ki kötü bir sorunu var.
Örnek olarak verdiğimiz verilere dönecek olursak. HesapKodu = 120.01.01 olan dört kayıt için bu SQL'i Ocak-Nisan aralığında çalıştırırsak hiç sorunsuz çalışır. Ancak HesapKodu = 120.02.02 olan kayıt için ne yazık ki sadece Şubat ayı için bir değer getirecektir. O yüzden ben bu SQL'e dokunmadan yine SP yazarak hiç kayıt olmayan aylar için temp tabloya 0 değerde kayıtlar attım. Yani şu hale getirdim:
HesapKodu GrupKodu AnaGrupKodu Ay_Kodu Ay_TolamTutar
120.01.01 Grp0001 AnaGrup001 2007_01 100
120.01.01 Grp0001 AnaGrup001 2007_02 250
120.01.01 Grp0001 AnaGrup001 2007_03 300
120.01.01 Grp0001 AnaGrup001 2007_04 550
120.02.02 Grp0002 AnaGrup001 2007_01 0
120.02.02 Grp0002 AnaGrup001 2007_02 75
120.02.02 Grp0002 AnaGrup001 2007_03 75
120.02.02 Grp0002 AnaGrup001 2007_04 75
Ve SQL'i bu temp tablo üzerinden çalıştırıp kümül toplamları döndürdüm. Tabii ki bu hız meselesi, bana bu yöntem esas tablonun gruplayıp, verilerini açıp, kümül toplatmaktan daha kolay geldi. Sizin seçiminiz! İlla ki cursor açmanız gerekiyor ne yazık ki.
Tabii tablodaki tekil alanlardan dönen ay değeri, her ay için bulunuyorsa sorun olmaz ama eğer, burda anlattığım şekilde SQL alıp kümül alacaksanız, mutlaka bir küçük sp ile değer olmayan aylara sıfırlı değerler insert etmelisiniz, raporunuzun her zaman doğru çalışması için.