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.
SELECT
t2.tarih,
t2.Toplam,
(
SELECT
SUM
(t1.Toplam)
FROM
Ornek_AylikGelir t1
WHERE
t1.tarih <= t2.tarih AND t1.CreateDateTime<=
t2.CreateDateTime)
AS
KumulatifToplam
FROM
Ornek_AylikGelir t2
ORDER
BY
t2.tarih
tarih 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.