Mikro Tedarikçi (Alış) Analizi SQL: En Çok Alım Yapılan Cariler
Mikro'da tedarikçi bazlı alış analizi: cari ayağından net alım toplamı, kalem ayağından ürün kırılımı, iade düşümü ve konsantrasyon sorguları.
Erp Asistanı
Editör ekibi
10 dk okuma
İçindekiler
Mikro'da "en çok alım yaptığımız tedarikçi hangisi" sorusunun tek bir cevabı yoktur; cevap hangi soruyu sorduğunuza göre iki ayrı tablodan çıkar. Kime ne kadar borçlandığımızı soruyorsanız CARI_HESAP_HAREKETLERI, hangi ürünü hangi tedarikçiden aldığımızı soruyorsanız STOK_HAREKETLERI doğru adrestir. İkisini aynı toplamda birleştirmek bu işin en pahalı hatasıdır: aynı fatura iki tarafta da bir satır olarak durduğu için toplamları üst üste koyduğunuzda alım tutarı iki katına çıkar.
Bu yazıda tedarikçi analizini iki ayrı rolde kuruyoruz: parasal toplam cha_evrak_tip = 0 (alış faturası) üzerinden, ürün kırılımı sth_evraktip = 3 (giriş faturası) üzerinden. Fatura kavramının tamamı için Mikro'da fatura hangi tabloda yazısı iyi bir başlangıç; satış tarafının aynası için de Mikro satış ve fatura raporu SQL hazır.
Kalem mi, para mı? İki tablonun rolü
Mikro'da tek bir "FATURALAR" tablosu yoktur. Alış faturası iki yere yayılır: kalemler STOK_HAREKETLERI içinde sth_evraktip = 3 satırları, cari (parasal) ayak ise CARI_HESAP_HAREKETLERI içinde cha_evrak_tip = 0 satırı. İki taraf sth_fat_uid = cha_Guid ile bağlanır.
| İhtiyaç | Tablo | Filtre | Ne verir |
|---|---|---|---|
| Tedarikçi bazlı alım tutarı, borç/alacak | CARI_HESAP_HAREKETLERI |
cha_iptal = 0 AND cha_evrak_tip = 0 |
parasal ayak, KDV dahil |
| Ürün bazlı alım, miktar, kalem maliyeti | STOK_HAREKETLERI |
sth_iptal = 0 AND sth_evraktip = 3 |
kalem detayı, net tutar |
| Fatura başlığı + kalemleri birlikte | iki tablo join | sth_fat_uid = cha_Guid |
doğrulama, kalem dökümü |
Alış tarafında kanonik satır: sth_tip = 0 (giriş) + sth_evraktip = 3 (giriş faturası) + sth_normal_iade = 0. Alış iadesi ise mal işletmeden çıktığı için çıkış tarafında, sth_tip = 1 + sth_evraktip = 4 + sth_normal_iade = 1 olarak durur. Net alış = girişler eksi iadeler. Sadece sth_evraktip = 3 yazıp iadeyi hiç düşmemek, tedarikçi maliyetinizi olduğundan yüksek gösterir.
Bir uyarı daha: satış tarafında doğrulanan davranışın alış karşılığı şudur - irsaliyeden faturalanan harekette mal satırı sth_evraktip = 13 olarak kalır ve fatura kendi sth_evraktip = 3 stok satırını üretmez. Yani "fatura tutarı" ile "mal girişinin tamamı" aynı çıkmayabilir. Fatura bazlı alım için 3, mal girişinin tamamı için IN (3, 13) kullanın.
1. Cari ayağından tedarikçi bazlı net alım
En hızlı ve en güvenilir başlangıç: parasal ayak. Alış faturası cha_evrak_tip = 0, iade cha_normal_Iade = 1 ile işaretlenir.
SELECT TOP 20
cha.cha_kod,
LTRIM(RTRIM(ISNULL(c.cari_unvan1,'') + ' ' + ISNULL(c.cari_unvan2,''))) AS Tedarikci,
COUNT(*) AS HareketSatiri,
CAST(SUM(CASE WHEN cha.cha_normal_Iade = 0 THEN cha.cha_meblag ELSE -cha.cha_meblag END) AS decimal(18,2)) AS NetAlim
FROM CARI_HESAP_HAREKETLERI cha
JOIN CARI_HESAPLAR c ON c.cari_kod = cha.cha_kod
WHERE cha.cha_iptal = 0
AND c.cari_iptal = 0 AND c.cari_hidden = 0
AND cha.cha_evrak_tip = 0
AND cha.cha_tarihi >= '20260101'
AND cha.cha_tarihi < '20270101'
-- AND cha.cha_d_cins = 0 -- sadece TL alışları için bu satırı açın
GROUP BY cha.cha_kod, c.cari_unvan1, c.cari_unvan2
ORDER BY NetAlim DESC;
Bu raporu SQL yazmadan, Türkçe sorarak alın: Mikro raporlama
cha_meblag orijinal döviz cinsindendir. Kurulumunuzda dövizli alış varsa toplamı TL sanmak sessiz bir hata üretir; ya cha_d_cins = 0 ile daraltın ya da toplamı döviz bazında okuyun.
2. Kalem ayağından net alış: giriş eksi iade
Aynı soruyu ürün tarafından sorduğunuzda tedarikçi kodu sth_cari_kodu üzerindedir. İadeyi tek CASE ile düşüyoruz:
SELECT TOP 20
sth.sth_cari_kodu,
CAST(SUM(CASE WHEN sth.sth_tip = 0 THEN sth.sth_tutar ELSE -sth.sth_tutar END) AS decimal(18,2)) AS NetAlim
FROM STOK_HAREKETLERI sth
WHERE sth.sth_iptal = 0
AND ((sth.sth_tip = 0 AND sth.sth_evraktip = 3 AND sth.sth_normal_iade = 0)
OR (sth.sth_tip = 1 AND sth.sth_evraktip = 4 AND sth.sth_normal_iade = 1))
AND sth.sth_tarih >= '20260101'
AND sth.sth_tarih < '20270101'
GROUP BY sth.sth_cari_kodu
ORDER BY NetAlim DESC;
Aynı dönem için 1. ve 2. sorgunun toplamı birebir tutmaz; kalem tutarı KDV ve masraf satırlarını içermez, cari meblağ içerir. Beklenen fark budur.
3. Tedarikçi + ürün kırılımı
"Hangi tedarikçiden neyi alıyoruz" sorusunun cevabı. Pazarlık ve alternatif tedarikçi çalışması bu tablodan yürür:
SELECT TOP 30
sth.sth_cari_kodu,
sth.sth_stok_kod,
CAST(SUM(CASE WHEN sth.sth_tip = 0 THEN sth.sth_miktar ELSE -sth.sth_miktar END) AS decimal(18,2)) AS NetMiktar,
CAST(SUM(CASE WHEN sth.sth_tip = 0 THEN sth.sth_tutar ELSE -sth.sth_tutar END) AS decimal(18,2)) AS NetTutar
FROM STOK_HAREKETLERI sth
WHERE sth.sth_iptal = 0
AND ((sth.sth_tip = 0 AND sth.sth_evraktip = 3 AND sth.sth_normal_iade = 0)
OR (sth.sth_tip = 1 AND sth.sth_evraktip = 4 AND sth.sth_normal_iade = 1))
AND sth.sth_tarih >= '20260101'
AND sth.sth_tarih < '20270101'
GROUP BY sth.sth_cari_kodu, sth.sth_stok_kod
ORDER BY NetTutar DESC;
Aynı stoğu birden fazla tedarikçiden alıyorsanız birim maliyet farkını burada görürsünüz; fiyat sapması takibi için alış fiyat sapması nasıl yakalanır yazısındaki kalıp devreye girer.
4. Aylık alış trendi
SELECT FORMAT(sth.sth_tarih, 'yyyy-MM') AS Donem,
CAST(SUM(CASE WHEN sth.sth_tip = 0 THEN sth.sth_tutar ELSE -sth.sth_tutar END) AS decimal(18,2)) AS NetAlim
FROM STOK_HAREKETLERI sth
WHERE sth.sth_iptal = 0
AND ((sth.sth_tip = 0 AND sth.sth_evraktip = 3 AND sth.sth_normal_iade = 0)
OR (sth.sth_tip = 1 AND sth.sth_evraktip = 4 AND sth.sth_normal_iade = 1))
AND sth.sth_tarih >= '20250101'
AND sth.sth_tarih < '20270101'
GROUP BY FORMAT(sth.sth_tarih, 'yyyy-MM')
ORDER BY Donem;
5. Tedarikçi konsantrasyonu: toplam alımın yüzde kaçı
Tek tedarikçiye bağımlılık riskini görmenin en kolay yolu. Kümülatif kolon, ilk N tedarikçinin toplamın yüzde kaçını taşıdığını gösterir:
WITH T AS (
SELECT cha.cha_kod,
SUM(CASE WHEN cha.cha_normal_Iade = 0 THEN cha.cha_meblag ELSE -cha.cha_meblag END) AS NetAlim
FROM CARI_HESAP_HAREKETLERI cha
WHERE cha.cha_iptal = 0
AND cha.cha_evrak_tip = 0
AND cha.cha_tarihi >= '20260101'
AND cha.cha_tarihi < '20270101'
GROUP BY cha.cha_kod
)
SELECT TOP 15
T.cha_kod,
CAST(T.NetAlim AS decimal(18,2)) AS NetAlim,
CAST(100.0 * T.NetAlim / NULLIF(SUM(T.NetAlim) OVER (), 0) AS decimal(5,2)) AS PayYuzde,
CAST(SUM(T.NetAlim) OVER (ORDER BY T.NetAlim DESC ROWS UNBOUNDED PRECEDING) AS decimal(18,2)) AS Kumulatif
FROM T
ORDER BY T.NetAlim DESC;
6. Altı aydır alım yapılmayan tedarikçiler
HAVING ile son alış tarihini kısıtlamak, "kartı açık ama hareketi ölü" carileri listeler:
SELECT cha.cha_kod,
MAX(cha.cha_tarihi) AS SonAlim,
DATEDIFF(DAY, MAX(cha.cha_tarihi), GETDATE()) AS GunGecen
FROM CARI_HESAP_HAREKETLERI cha
WHERE cha.cha_iptal = 0
AND cha.cha_evrak_tip = 0
GROUP BY cha.cha_kod
HAVING MAX(cha.cha_tarihi) < DATEADD(MONTH, -6, GETDATE())
ORDER BY SonAlim;
7. Faturayı iki tablodan doğrulama
Bir tedarikçiyle rakam tutmuyorsa tek bir faturayı iki taraftan karşılaştırın. Sol tarafta cari meblağ, sağ tarafta kalemlerin toplamı:
SELECT cha.cha_evrakno_seri,
cha.cha_evrakno_sira,
cha.cha_kod,
CAST(cha.cha_meblag AS decimal(18,2)) AS CariMeblag,
COUNT(sth.sth_Guid) AS KalemSayisi,
CAST(SUM(CASE WHEN sth.sth_normal_iade = 0 THEN sth.sth_tutar ELSE -sth.sth_tutar END) AS decimal(18,2)) AS KalemTutar
FROM CARI_HESAP_HAREKETLERI cha
LEFT JOIN STOK_HAREKETLERI sth
ON sth.sth_fat_uid = cha.cha_Guid
AND sth.sth_iptal = 0
WHERE cha.cha_iptal = 0
AND cha.cha_evrak_tip = 0
AND cha.cha_tarihi >= '20260101'
AND cha.cha_tarihi < '20260201'
GROUP BY cha.cha_Guid, cha.cha_evrakno_seri, cha.cha_evrakno_sira, cha.cha_kod, cha.cha_meblag
ORDER BY KalemTutar DESC;
KalemSayisi = 0 çıkan bir alış faturası, kalemleri Mikro'da bulunmayan (örneğin sadece hizmet veya masraf satırı olan) bir kayıttır; bu satırı ürün analizinde aramayın.
Sık yapılan hatalar
cha_evrak_tip = 0ilesth_evraktip = 3toplamlarını aynı sorguda SUM etmek. Aynı fatura iki tarafta da satırdır, alım tutarı iki katına çıkar.- Alış iadesini düşmemek:
sth_normal_iade = 1vecha_normal_Iade = 1satırları yok sayılırsa maliyet yüksek görünür. cha_meblagalanını TL sanmak. Dövizli alışta tutar orijinal döviz cinsindendir; TL toplam içincha_d_cins = 0ile daraltın.- Tarih filtresi koymamak; sorgu tüm yılların toplamını getirir ve "en çok alım yapılan cari" listesi geçmişin tortusuyla dolar.
cari_unvan2boş olduğunda ünvan birleştirmesinin NULL dönmesi.ISNULLkullanmazsanız tedarikçi adı boş görünür.- İrsaliyeden faturalanan alışları
sth_evraktip = 3filtresiyle arayıp "kayıt yok" sonucuna varmak. Mal hareketi13satırında kalıyor olabilir.
Sık sorulanlar
Aynı tedarikçi listesini neden iki sorguyla alıyorum? Çünkü biri parasal ayak (CARI_HESAP_HAREKETLERI, KDV dahil), diğeri kalem ayağı (STOK_HAREKETLERI, ürün kırılımlı). İkisi farklı soruya cevap verir; birini diğerinin yerine kullanmak ya KDV farkı ya da ürün detayı kaybı demektir.
Net mi brüt mü raporlamalıyım? Satın alma performansı ve tedarikçi karşılaştırması için net (iade düşülmüş) rakam doğrudur. İade süreçlerini ayrı izliyorsanız brüt ve iade tutarını iki kolon olarak yan yana verin.
Alış iadeleri raporda neden farklı evrak tipinde? İade mal işletmeden çıktığı için çıkış yönünde hareket eder; bu yüzden sth_tip = 1 + sth_evraktip = 4 + sth_normal_iade = 1 kombinasyonunda aranır. Sadece giriş faturasına bakan sorgu bu satırları hiç görmez.
Sorgu çalışıyor ama rakam tedarikçinin ekstresiyle tutmuyor, nereden bakmalıyım? Önce 7. sorguyla tek faturayı karşılaştırın: fark genellikle masraf, KDV veya döviz kurundan gelir. Cari bakiye için Mikro'nun fn_CariFoy fonksiyonu resmi hesabı verir.
Tedarikçi analizi, doğru tabloyu doğru filtreyle okumakla başlar: *_iptal = 0, iade düşümü ve tek bir dönem. Bu üç kural oturduğunda geri kalan her şey kırılım seçimidir: tedarikçi, ürün, ay, grup. Kendi veritabanınıza bağlı olarak "geçen çeyrekte en çok alım yaptığımız 10 tedarikçi" gibi bir cümleyi Türkçe yazıp saniyeler içinde SQL almak isterseniz Erp Asistanı'na ücretsiz üye olun.
Ücretsiz üye olun, tedarikçi analizi sorgunuzu doğal dille alın →
Bu raporu SQL yazmadan, Türkçe sorarak 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.




