![]() |
|
| |||||||
|
| WebMasTer SiTeSi |
| | Seçenekler |
|
#1
| ||||
| | ||||
Select SQL ile kümül toplam nasıl alınırKü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. kolay gelsin ![]()
__________________ www.cunobag.tr.gg |
![]() |
| Arama Etiketleri: alinir, kumul, select, sql, toplam |
| Seçenekler | |
| |
Benzer Konular | ||||
| Konu | Konu Açanlar | Forum | Cevaplar | Güncel Mesajlar |
| lınk nasıl alınır yada verılır | ahmet.tt | Google Pagerank | 7 | 01-08-2008 05:14 |
| Trojan ( Truva At'ı ) nedir ve nasıl tedbir alınır? | kadınca | İşletim Sistemleri | 1 | 17-03-2008 02:02 |
| Alan adı(domain name) nedir? Nasıl ve nereden alınır? | egitimbilgisi | Yeni Başlayanlara WebmasterSitesi | 0 | 29-02-2008 01:25 |
| Yahoo Messenger Nedir? Nasıl Alınır? Nasıl Kullanılır? | kadınca | Webmaster Sözlügü | 0 | 24-02-2008 08:52 |
| Select Top n - Select Top n With Ties | B737 | Veritabanı programcılığı | 0 | 24-02-2008 04:53 |
![]() |