Bazi raporlama ihtiyaçlarinda kümülatif toplam verisine ihtiyaç duyariz. Bu kisa makalemizde Cursor veya döngü kullanmadan, belirli bir alana göre veriyi siralayarak bir kolonun kümülatif olarak toplamini nasil alacagimizi anlatacagim.
Ilk olarak örnegimizde kullanacagimiz tabloyu ve örnek datalari olusturalim. Bunun için asagidaki scripti kullanalim.
create table Ornek_AylikGelir
(
tarih datetime,
Toplam int,
)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.01',100)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.02',50)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.03',20)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.04',80)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.05',100)
insert into Ornek_AylikGelir(tarih,Toplam) values('2012.05.06',200)
Yukaridaki script sonucunda tablomuzda asagidaki kayitlar yer aldi.
select * from Ornek_AylikGelir
| tarih | Toplam |
|---|---|
| 2012-05-01 00:00:00.000 | 100 |
| 2012-05-02 00:00:00.000 | 50 |
| 2012-05-03 00:00:00.000 | 20 |
| 2012-05-04 00:00:00.000 | 80 |
| 2012-05-05 00:00:00.000 | 100 |
| 2012-05-06 00:00:00.000 | 200 |
Simdi yeni bir sorgu ile Toplam kolonunda yazan miktari tarihe göre kümülatif olarak hesaplayip hemen yanina yazalim. Bu islem için tablomuza iki kez gidecegiz. Her kayit ayni tabloya tekrar gidip kendi tarihinden küçük olan kayitlardaki Toplam alanini toplayacagiz.
SELECT t2.tarih,
t2.Toplam,
(
SELECT SUM(t1.Toplam) FROM Ornek_AylikGelir t1
WHERE t1.tarih <= t2.tarih
) AS KumulatifToplam
FROM Ornek_AylikGelir t2
ORDER BY t2.tarih
| tarih | Toplam | KumulatifToplam |
|---|---|---|
| 2012-05-01 00:00:00.000 | 100 | 100 |
| 2012-05-02 00:00:00.000 | 50 | 150 |
| 2012-05-03 00:00:00.000 | 20 | 170 |
| 2012-05-04 00:00:00.000 | 80 | 250 |
| 2012-05-05 00:00:00.000 | 100 | 350 |
| 2012-05-06 00:00:00.000 | 200 | 550 |
hasan hocam verdi?in verilerlede kümülatif toplam hesaplayacak bir alan yok,
Merhaba,
Iki ayni tarih olma ihtimali çok yüksek bu durumlar için tablona bir alan daha eklemelisin bu alan kayitin olusturulma tarih saat sn salise (DateTime.Now()) bilgilerini tutacak.
SELECTt2.tarih,t2.Toplam,(SELECTSUM(t1.Toplam)FROMOrnek_AylikGelir t1WHEREt1.tarih <= t2.tarih AND t1.CreateDateTime<=t2.CreateDateTime)ASKumulatifToplamFROMOrnek_AylikGelir t2ORDERBYt2.tarihtarih ayny oldu?u zaman kümülatif toplamda problem oluyor. bunun için bir çözüm varmy?
Bu durum karsimiza çiktigi zaman çok zaman alabilir. Çok iyi bir örnek olmus. Kisa ve etkili bir sql cümlesi.