Ö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
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
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
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.
Esasen, sadece sütun eklemek istiyor fakat yapamıyorum.
Barış,tam olarak neyi kast ettiğini anlamadım. Eğer makaledeki sorguları kastediyorsan bunları çok rahat VIEW içerisine alabilirsin.