SQL Server Önceki Satırların Toplamı

Özellikle bazı raporlarda veri satırlarının yanına kendinden önceki satılardaki bir alanın toplamını yazma ihtiyacı duyabiliyoruz. Aşağıdaki gibi Satis isimli bir tablo olduğunu düşünelim.

Bu tabloda her dönemin karşısında o döneme ait ciro bulunmaktadır. Bu tablodaki verilere dayalı olarak aşağıdaki gibi bir sonuç elde etmek istiyoruz.


Bu sonucu elde etmek için Satis tablosunu kendisiyle JOIN etmemiz gerekmektedir. Tabloları Donem alanı üzerinden ilişkilendirmeliyiz. Her satırın karşısına kendisinden önceki dönemleri getirerek gruplama yapıyoruz.

SELECT a.Donem,ISNULL(SUM(b.Tutar),0) OncekiToplam
FROM Satis a LEFT JOIN Satis b ON a.Donem>b.Donem
GROUP BY  a.Donem

Burada LEFT JOIN yapmamızın nedeni 201001 öncesinde kayıt olmadığı içindir. Her dönemin karşısına o dönemin tutarını da yazarsak kümülatif toplamı daha net görmüş oluruz.

SELECT a.Donem,MAX(a.Tutar)DonemTutari,ISNULL(SUM(b.Tutar),0) OncekiToplam
FROM Satis a LEFT JOIN Satis b ON a.Donem>b.Donem
GROUP BY  a.Donem


Satis tablosunu aşağıdaki gibi biraz daha detaylandıralım. Hem mağaza kolonunu ekleyelim hem de bir döneme ait birden fazla satır olacak şeklinde düzenleme yapalım.

Burada bir döneme ait birden fazla satır olduğu için tabloyu bu haliyle JOIN ettiğimizde önceki dönemlere ait mükerrer kayıtlar da toplanmış olacaktır. Bu yüzden tabloyu öncelikle Dönem alanına göre özetlemek lazım.

SELECT a.Donem,MAX(a.Tutar)DonemTutari,ISNULL(SUM(b.Tutar),0) OncekiToplam FROM
	(SELECT Donem,SUM(Tutar)Tutar FROM Satis GROUP BY Donem) a
		LEFT JOIN
	(SELECT Donem,SUM(Tutar)Tutar FROM Satis GROUP BY Donem) b
		ON a.Donem>b.Donem
GROUP BY  a.Donem

Bu sorgudaki SELECT Donem,SUM(Tutar)Tutar FROM Satis GROUP BY Donem iç sorguyu bir View olarak ta oluşturabiliriz. Böylece sorgumuz daha anlaşılır olacaktır.
Veya SQL Server 2005 ile birlikte gelen Common Table Expression deyim yapısını kullanabiliriz.

WITH cteSatis AS
(
	SELECT Donem,SUM(Tutar)Tutar FROM Satis GROUP BY Donem
)

SELECT a.Donem,MAX(a.Tutar)DonemTutari,ISNULL(SUM(b.Tutar),0) OncekiToplam
FROM cteSatis a LEFT JOIN cteSatis b ON a.Donem>b.Donem
GROUP BY  a.Donem

SQL Server Önceki Satırların Toplamı” üzerine 5 düşünce

  1. Kadir

    Ahmet bey Merhaba,
    Sorum tam bu makale ile eşleşmiyor fakat ben sizinle paylaşmak istiyorum.Fatura satırları tablosu düşünün. Her urunun satıldıgı Farklı fıyatların toplamı, Ortalamasi Ve Adetini aşağıdaki gibi buluyorum.
    bunların yanına ürünün en son satılan fiyatını yazdırmak istiyorum.(Tabloda satışTarihi alanı mevcut)Bu konuda bir öneriniz varmıdır acaba?SELECT UrunId,
    Sum(distinct BirimFiyat) Toplam,
    Avg(distinct BirimFiyat) Ortalama,
    count(distinct BirimFiyat) Adet
    FROM
    FaturaSatirlari
    GROUP BY UrunId
    order by 1 desc

    Cevapla
  2. Ahmet Kaymaz Yazar

    Kadir Bey,
    en sonki fiyatı ne yazık ki subquery dışında bir yöntemle bulmak zor. Aşağıdaki gibi bir sorgu işinizi görebilir.SELECT T.*,F.BirimFiyat FROM (
    SELECT UrunId,
    Sum(distinct BirimFiyat) Toplam,
    Avg(distinct BirimFiyat) Ortalama,
    count(distinct BirimFiyat) Adet,
    MAX(SatisTarihi)MaxSatisTarihi
    FROM FaturaSatirlari
    GROUP BY UrunId
    ) AS T INNER JOIN FaturaSatirlari F ON T.UrunId=F.UrunId AND T.MaxSatisTarihi=F.SatisTarihi

    Cevapla
  3. Barış

    Merhaba Ahmet bey,View olarak oluşturmak istediğimde bir hata mesajı ile karşılaşıyorum. Paylaşmış olduğunuz QUERY kesinlikle işimi fazlasıyla görecektir. View olarak da alabilir miyim sizden?Teşekkürler.

    Cevapla
  4. Ahmet Kaymaz Yazar

    Barış,tam olarak neyi kast ettiğini anlamadım. Eğer makaledeki sorguları kastediyorsan bunları çok rahat VIEW içerisine alabilirsin.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.