Mikro İade Raporu SQL: En Çok İade Edilen Ürünler ve İade Oranı
Mikro v16 ve v17 için sth_normal_iade kullanarak en çok iade edilen ürünleri ve satışa göre iade oranını hesaplayan T-SQL sorgu rehberi.
Erp Asistanı
Editör ekibi
7 dk okuma
İçindekiler
Mikro ERP veritabanında doğru ciro ve stok hesabı yapabilmek için satışların yanında iadeleri de detaylı biçimde analiz etmek gerekir. Satış faturası kalemlerinde normal satış ve iade satırları aynı tabloda tutulduğu için, doğru mantık kurulmadığında iade miktarları toplam ciroya eklenebilir veya hatalı oranlar elde edilebilir. Bu rehberde, STOK_HAREKETLERI tablosundaki sth_normal_iade alanını kullanarak en çok iade edilen ürünleri listelemeyi, tutar ve miktar bazında iade oranlarını SQL ile hatasız hesaplamayı inceleyeceğiz. Mikro'da fatura hareketlerinin genel yapısını anlamak için Mikro tablo yapısı rehberi başlıklı yazımızdan da yararlanabilirsiniz.
Mikro'da İade Mantığı: sth_normal_iade Nasıl Çalışır?
Mikro v16 ve v17 veritabanlarında satış faturalarının kalemleri STOK_HAREKETLERI tablosunda sth_evraktip = 4 (Çıkış Faturası) parametresiyle saklanır. Satış hareketlerinin normal satış mı yoksa müşteri iadesi mi olduğu ise sth_normal_iade kolonu ile ayırt edilir:
- sth_normal_iade = 0: Normal Satış
- sth_normal_iade = 1: Müşteri İadesi (Satış İadesi)
Ayrıca iptal edilmiş kayıtları rapordan çıkarmak için her zaman sth_iptal = 0 kontrolü eklenmelidir. Ciro ve iade oranlarını değerlendirirken kullanabileceğiniz temel parametreler şunlardır:
| Kolon Adı | Veri Tipi | Açıklama / Değerler |
|---|---|---|
| sth_evraktip | tinyint | 4: Çıkış Faturası (Satış) |
| sth_normal_iade | tinyint | 0: Normal, 1: İade |
| sth_iptal | bit | 0: Aktif Kayıt, 1: İptal Evrak |
| sth_miktar | float | Kalem Hareket Miktarı |
| sth_tutar | float | Net Kalem Satır Tutarı |
1. Ürün Bazında Toplam Satış ve İade Miktarları
İlk adım olarak ürünlerin brüt satış miktarını ve iade miktarlarını tek bir sorguda yan yana görelim.
SELECT
sh.sth_stok_kod,
s.sto_isim,
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_miktar ELSE 0 END) AS BrutSatisMiktari,
SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_miktar ELSE 0 END) AS IadeMiktari,
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_miktar ELSE -sh.sth_miktar END) AS NetSatisMiktari
FROM STOK_HAREKETLERI sh
JOIN STOKLAR s ON s.sto_kod = sh.sth_stok_kod
WHERE sh.sth_iptal = 0
AND sh.sth_evraktip = 4
GROUP BY sh.sth_stok_kod, s.sto_isim
ORDER BY IadeMiktari DESC;
2. Sıfıra Bölme Koruması ile İade Oranı Hesaplama (NULLIF)
Bir stok için brüt satış hiç gerçekleşmemişse veya filtreleme nedeniyle sıfır geliyorsa, iade oranını hesaplarken bölme işleminde "Divide by zero error" hatası alınır. T-SQL dilinde bu durum NULLIF ve ISNULL fonksiyonları ile çözülür.
SELECT TOP 20
sh.sth_stok_kod,
s.sto_isim,
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END) AS BrutSatisTutari,
SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) AS IadeTutari,
ROUND(
ISNULL(
(SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) * 100.0)
/ NULLIF(SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END), 0),
0
), 2
) AS [IadeOrani_Yuzde]
FROM STOK_HAREKETLERI sh
JOIN STOKLAR s ON s.sto_kod = sh.sth_stok_kod
WHERE sh.sth_iptal = 0
AND sh.sth_evraktip = 4
GROUP BY sh.sth_stok_kod, s.sto_isim
HAVING SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) > 0
ORDER BY [IadeOrani_Yuzde] DESC;
3. Tarih Aralıklı ve Miktar/Tutar Detaylı İade Raporu
Belli bir tarih aralığında en çok iade edilen ürünleri ve iade oranlarını hem miktar hem tutar bazında tek raporda dökebilirsiniz. Benzer ciro ve satış raporları için Mikro satış ve fatura raporu SQL içeriğimizden de yararlanabilirsiniz.
SELECT
sh.sth_stok_kod,
s.sto_isim,
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_miktar ELSE 0 END) AS BrutSatisAdet,
SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_miktar ELSE 0 END) AS IadeAdet,
ROUND(
ISNULL(
(SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_miktar ELSE 0 END) * 100.0)
/ NULLIF(SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_miktar ELSE 0 END), 0),
0
), 2
) AS [MiktarIadeOrani_%],
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END) AS BrutSatisTutar,
SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) AS IadeTutar,
ROUND(
ISNULL(
(SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) * 100.0)
/ NULLIF(SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END), 0),
0
), 2
) AS [TutarIadeOrani_%]
FROM STOK_HAREKETLERI sh
JOIN STOKLAR s ON s.sto_kod = sh.sth_stok_kod
WHERE sh.sth_iptal = 0
AND sh.sth_evraktip = 4
AND sh.sth_tarih >= '20260101' AND sh.sth_tarih < '20270101'
GROUP BY sh.sth_stok_kod, s.sto_isim
ORDER BY IadeTutar DESC;
4. Müşteri Bazında En Çok İade Yapan Cariler
İadeler sadece stok bazında değil, müşteri bazında da analiz edilebilir. Aşağıdaki sorgu stok hareketlerinden cari koduna göre iade tutarlarını ve müşteri iade oranını listeler.
SELECT TOP 15
sh.sth_cari_kodu,
SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END) AS ToplamSatis,
SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) AS ToplamIade,
ROUND(
ISNULL(
(SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) * 100.0)
/ NULLIF(SUM(CASE WHEN sh.sth_normal_iade = 0 THEN sh.sth_tutar ELSE 0 END), 0),
0
), 2
) AS [CariIadeOrani_%]
FROM STOK_HAREKETLERI sh
WHERE sh.sth_iptal = 0
AND sh.sth_evraktip = 4
GROUP BY sh.sth_cari_kodu
HAVING SUM(CASE WHEN sh.sth_normal_iade = 1 THEN sh.sth_tutar ELSE 0 END) > 0
ORDER BY ToplamIade DESC;
Sık yapılan hatalar
- sth_iptal = 0 filtresini unutmak: İptal edilmiş fatura satırları hesaba katıldığında iade tutarları ve oranlar hatalı şişer.
- sth_normal_iade = 1 kaydını düşmek yerine brüt satışa toplamak: İade hareketlerini pozitif brüt satış gibi toplarsanız ciro ve satış adedi yanlış çıkar.
- NULLIF kullanmadan bölme yapmak: Satışı 0 olan ürünlerde veya seçilen dönemde satılmayıp sadece iadesi girilen ürünlerde SQL "Divide by zero error" verir.
- sth_evraktip filtresi koymamak: Alış veya depo hareketleri rapora dahil edilirse satış iade oranları bozulur. Sadece çıkış faturası için sth_evraktip = 4 seçilmelidir.
- sto_pasif_fl veya sto_iptal kontrollerini göz ardı etmek: Pasif stokların iade dökümünde çıkması durumunda kart durumları dikkate alınmalıdır.
Sık sorulanlar
Soru? Mikro'da iade faturası kesildiğinde sth_evraktip değişir mi? Cevap: Müşteri satış iadelerinde evrak tipi genelde çıkış faturası (sth_evraktip = 4) altında sth_normal_iade = 1 olarak işaretlenir. Alış iadeleri ise alış faturası (sth_evraktip = 3) altında sth_normal_iade = 1 olarak tutulur.
Soru? İade oranını hesaplarken net satışa mı yoksa brüt satışa mı bölmeliyim? Cevap: Genel kabul gören standart oran, İade / Brüt Satış oranıdır. Böylece satılan her 100 birim ürünün kaç biriminin iade geldiği yüzde olarak bulunur.
Soru? SQL sorgusunda iade tutarları eksi mi görünür? Cevap: STOK_HAREKETLERI tablosundaki sth_tutar alanında iadeler pozitif sayı olarak saklanır. Net ciro hesabı yapılırken CASE WHEN sth_normal_iade = 0 THEN sth_tutar ELSE -sth_tutar END şeklinde eksiye dönüştürülür.
Mikro ERP sisteminizde satış ve iade analizi yapmak, hangi ürünlerde kalite veya lojistik problemleri olduğunu anlamak için kritik öneme sahiptir. Erp Asistanı'na ücretsiz kaydolup kendi veritabanınızı bağlayarak doğal dilde soru sorabilir, SQL yazmaya gerek kalmadan canlı iade raporlarınızı anında alabilirsiniz.
Mikro'da SQL ve raporu konuşarak alın
Türkçe sorunuzu yazın, şemanıza uygun çalışan SQL'i ya da hazır uygulamanızı saniyeler içinde alın. Kredi kartı gerekmez.