Aylık satış raporunuz toplam ciroyu gösteriyor, ancak büyümenin hangi ayda hızlandığını görmek için veriyi her seferinde Excel’e mi taşıyorsunuz?
Oracle SQL ile dönem toplamlarını hesaplayıp bir önceki ve bir sonraki satırdaki değerleri aynı sonuç kümesine getirebilirsiniz. Bunun için aylık gruplama ile LAG ve LEAD analitik fonksiyonlarını birlikte kullanmak yeterlidir.
Asıl dikkat edilmesi gereken nokta, önceki satır ile önceki takvim ayının her zaman aynı olmamasıdır. Bu rehberde örnek satış kayıtlarından aylık karşılaştırma oluşturacak, eksik ayların ve sıfır değerlerinin raporu nasıl etkilediğini ele alacağız. Tüm tutarlar anlatım amacıyla oluşturulmuş örnek verilerdir.
LAG ve LEAD ne işe yarar?
LAG, belirlediğiniz sıralamada önceki satırdaki değeri getirir. LEAD aynı işlemi sonraki satır için yapar. Varsayılan uzaklık bir satırdır. Bu fonksiyonları aylık toplamlar üzerinde kullandığınızda geçmiş ve gelecek dönem değerlerini raporun aynı satırında inceleyebilirsiniz. Dönem sırasını OVER içindeki ORDER BY belirler.
Örneğin ocak ayı satırında 100.000 TL, şubatta 125.000 TL ve martta 120.000 TL bulunduğunu düşünün. Şubatın önceki dönem tutarı 100.000 TL olur. Bu tutarla karşılaştırıldığında artış yüzde 25’tir. Mart ayının şubata göre değişimi ise yüzde eksi 4’tür. İlk satırın önceki değeri olmadığı için sonuç NULL olabilir.
Önce satışları ay bazında toplayın
Aşağıdaki örnek, satış tarihini ve tutarı içeren küçük bir veri kümesini sorgunun içinde oluşturur. Aylık toplama, analitik fonksiyonlar ve yüzde hesabı ayrı adımlarda tutulmuştur. Gerçek bir tabloda satislar bölümünü kendi tablo ve sütun adlarınıza uyarlayabilirsiniz.
WITH satislar AS (
SELECT DATE '2026-01-10' satis_tarihi,
100000 tutar FROM dual
UNION ALL
SELECT DATE '2026-02-10', 125000 FROM dual
UNION ALL
SELECT DATE '2026-03-10', 120000 FROM dual
), aylik AS (
SELECT TRUNC(satis_tarihi, 'MM') ay,
SUM(tutar) toplam
FROM satislar
GROUP BY TRUNC(satis_tarihi, 'MM')
), karsilastirma AS (
SELECT ay, toplam,
LAG(toplam) OVER (ORDER BY ay) onceki,
LEAD(toplam) OVER (ORDER BY ay) sonraki
FROM aylik
)
SELECT TO_CHAR(ay, 'YYYY-MM') ay,
toplam, onceki, sonraki,
ROUND(100 * (toplam - onceki)
/ NULLIF(onceki, 0), 2) degisim_yuzde
FROM karsilastirma
ORDER BY ay;
Bu örnekte beklenen şubat değişimi 25, mart değişimi -4 olur. NULLIF, önceki tutar sıfır olduğunda paydanın NULL olmasını sağlar. Böylece sıfıra bölme yerine hesaplanamayan bir oran elde edilir. Bu sonucu arayüzde “hesaplanamadı” olarak göstermek, yanlışlıkla yüzde sıfır şeklinde sunmaktan daha açıklayıcıdır.
Eksik ay varsa önceki satıra dikkat edin
Ocak ve mart satışları bulunuyor, şubat için hiç kayıt bulunmuyorsa LAG mart satırında ocağı getirir. Bu, kaydı bulunan önceki dönemdir. “Bir önceki ay” etiketiyle sunulduğunda okuyucuyu yanıltabilir. Rapor tanımını veri ekibiyle netleştirmek bu nedenle önemlidir.
Takvim aylarıyla kesintisiz karşılaştırma gerekiyorsa önce bir takvim tablosundan tüm ayları üretin. Aylık satışları bu listeye LEFT JOIN ile bağlayın ve analitik hesabı bundan sonra yapın. Kayıt olmayan ayın gerçekten satış yapılmayan bir ay mı, yoksa eksik veri aktarımı mı olduğunu belirlemeden NULL değerleri sıfıra çevirmeyin.
Şube ve ürün bazında karşılaştırma
Her şubenin kendi geçmişiyle karşılaştırılması için aylık toplamları şube ve ay düzeyinde oluşturmanız gerekir. Ardından LAG(toplam) OVER (PARTITION BY sube_id ORDER BY ay) ifadesi kullanılabilir. Böylece bir şubenin son ayı, başka bir şubenin ilk ayına bağlanmaz.
Sorgu tasarımında bu ayrımı, dönem toplamlarını ve veri kalitesi kontrollerini birlikte öğrenmek isteyen ekipler İleri Düzey Oracle PL/SQL ile Veri Analizi Eğitimi içeriğini inceleyebilir. Günlük rapor ihtiyacını daha gelişmiş sorgulama becerileriyle ilişkilendirmek, eğitime taşınacak gerçek senaryoları da belirlemeye yardımcı olur.
Raporu yayımlamadan önce kontrol edin
- İade ve iptallerin tutara nasıl yansıtıldığını, kullanılan para birimini ve tarih alanını netleştirin.
- Aylık toplamın doğru ayrıntı düzeyinde üretildiğini ve aynı ay için yinelenen satır oluşmadığını doğrulayın.
- İlk dönem, sıfır önceki dönem, eksik ay ve birden fazla şube senaryolarını ayrı ayrı inceleyin.
- Sorgunun sonuç sırasını en dıştaki ORDER BY ile belirleyin. Analitik sıralamanın çıktı sırasını garanti ettiğini varsaymayın.
Sık sorulan sorular
LAG kullanmak için PL/SQL yazmak gerekir mi?
Hayır. LAG ve LEAD, SQL sorgusu içinde kullanılabilen analitik fonksiyonlardır. Bir prosedür veya fonksiyon yazmadan da dönem karşılaştırması yapabilirsiniz.
LEAD gelecek ayın satışını tahmin eder mi?
Hayır. LEAD, sorgu sonucunda zaten bulunan sonraki satırın değerine erişir. Henüz gerçekleşmemiş satışları tahmin etmez.
Önceki ay sıfırken yüzde değişim nasıl sunulmalı?
Standart yüzde değişim hesabının paydası sıfır olur. Böyle bir durumda tutar farkını göstermek ve yüzdeyi hesaplanamadı olarak belirtmek uygun bir raporlama tercihidir. Kullanılacak gösterim kurumun rapor tanımında açıklanmalıdır.
Teknik kaynak
Fonksiyonun davranışını ve sözdizimini Oracle LAG dokümantasyonundan kontrol edebilirsiniz.
