Erp Asistanı Erp Asistanı
Mikro SQL

Mikro KDV Raporu SQL: Oran Bazında Satış ve Alış KDV Dökümü

Mikro'da satış ve alış faturalarından KDV oranı bazında döküm almak için SQL sorguları. Aylık rapor, iade düzeltmesi, yuvarlama uyarıları.

Erp Asistanı Erp Asistanı Editör ekibi 5 dk okuma
Mikro KDV Raporu SQL: Oran Bazında Satış ve Alış KDV Dökümü

Mikro kullanıcıları için KDV raporu, özellikle oran bazında satış ve alış dökümü almak sık karşılaşılan bir ihtiyaçtır. Bu yazıda, STOK_HAREKETLERI tablosundan doğrudan çalışan SQL sorguları ile hem satış hem alış tarafını aylık dönemlerde KDV oranı kırılımında nasıl raporlayacağınızı adım adım anlatıyoruz. Temel tablo bilgisi için Mikro tablo yapısı rehberi'ne, fatura-rapor ilişkisi için fatura hangi tabloda yazısına göz atabilirsiniz.

Mikro'da KDV Bilgisi Nerede?

KDV oranı ve tutarı STOK_HAREKETLERI satırlarında saklanır. Her fatura kalemi için:

  • sth_vergi: KDV oranı (yüzde, float)
  • sth_tutar: KDV hariç net satır tutarı (matrah)

KDV tutarı veritabanında doğrudan bir alanda tutulmaz; ihtiyaç duyulduğunda sth_tutar * sth_vergi / 100.0 formülüyle hesaplanır. Bu hesaplama, kayan nokta yuvarlama farklarına yol açabilir; resmî beyannameler için Mali Mühür onaylı çıktıları esas almalısınız.

Aşağıdaki tablo kullanacağımız kritik alanları özetler:

Alan Açıklama Not
sth_tarih Hareket tarihi Ay/yıl kırılımı için
sth_evraktip Evrak türü 4 = Satış, 3 = Alış
sth_vergi KDV oranı (%) Gruplama anahtarı
sth_tutar Net satır tutarı Matrah
sth_normal_iade Normal/İade bayrağı 0:Normal, 1:İade (düşülmeli)
sth_iptal İptal bayrağı ZORUNLU = 0

Oran Bazında Aylık Satış KDV Dökümü

Aşağıdaki sorgu, belirtilen yıl için her ay ve her KDV oranı için toplam matrah ve KDV tutarını döndürür. İade faturaları (sth_normal_iade = 1) ters işaretle düşülmüştür.

SELECT 
    YEAR(sth_tarih) AS Yil,
    MONTH(sth_tarih) AS Ay,
    sth_vergi AS KDV_Orani,
    SUM(CASE WHEN sth_normal_iade = 0 THEN sth_tutar ELSE -sth_tutar END) AS Matrah,
    SUM(CASE WHEN sth_normal_iade = 0 THEN sth_tutar * sth_vergi / 100.0 
             ELSE -sth_tutar * sth_vergi / 100.0 END) AS KDV_Tutari
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0 
  AND sth_evraktip = 4
  AND sth_tarih >= '20260101' AND sth_tarih < '20270101'
GROUP BY YEAR(sth_tarih), MONTH(sth_tarih), sth_vergi
ORDER BY Yil, Ay, KDV_Orani;

Tarih aralığını kendi döneminize göre ayarlayın. sth_evraktip = 4 yalnızca çıkış faturalarını seçer; irsaliye vb. karışmaz.

Oran Bazında Aylık Alış KDV Dökümü

Satışın simetriği olan alış tarafı için sth_evraktip = 3 filtresi kullanılır. Mantık aynıdır.

SELECT 
    YEAR(sth_tarih) AS Yil,
    MONTH(sth_tarih) AS Ay,
    sth_vergi AS KDV_Orani,
    SUM(CASE WHEN sth_normal_iade = 0 THEN sth_tutar ELSE -sth_tutar END) AS Matrah,
    SUM(CASE WHEN sth_normal_iade = 0 THEN sth_tutar * sth_vergi / 100.0 
             ELSE -sth_tutar * sth_vergi / 100.0 END) AS KDV_Tutari
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0 
  AND sth_evraktip = 3
  AND sth_tarih >= '20260101' AND sth_tarih < '20270101'
GROUP BY YEAR(sth_tarih), MONTH(sth_tarih), sth_vergi
ORDER BY Yil, Ay, KDV_Orani;

İade faturaları alış tarafında da benzer düzeltme gerektirir; sth_normal_iade kontrolü burada da yapılmıştır.

Satış ve Alışı Birleştirip Ödenecek KDV'yi Hesaplama

Bir sonraki adım, satış KDV'sinden alış KDV'sini düşerek dönem net KDV yükünü hesaplamaktır. Aşağıdaki sorgu her iki tarafı birleştirir ve oran bazında ödenmesi gereken KDV'yi çıkarır.

SELECT 
    s.Yil, s.Ay, s.KDV_Orani,
    s.Matrah AS Satis_Matrah,
    s.KDV_Tutari AS Satis_KDV,
    ISNULL(a.Matrah,0) AS Alis_Matrah,
    ISNULL(a.KDV_Tutari,0) AS Alis_KDV,
    s.KDV_Tutari - ISNULL(a.KDV_Tutari,0) AS Odenmesi_Gereken_KDV
FROM 
    (SELECT YEAR(sth_tarih) Yil, MONTH(sth_tarih) Ay, sth_vergi KDV_Orani,
            SUM(CASE WHEN sth_normal_iade=0 THEN sth_tutar ELSE -sth_tutar END) Matrah,
            SUM(CASE WHEN sth_normal_iade=0 THEN sth_tutar*sth_vergi/100.0 ELSE -sth_tutar*sth_vergi/100.0 END) KDV_Tutari
     FROM STOK_HAREKETLERI
     WHERE sth_iptal=0 AND sth_evraktip=4 
       AND sth_tarih>='20260101' AND sth_tarih<'20270101'
     GROUP BY YEAR(sth_tarih), MONTH(sth_tarih), sth_vergi) s
LEFT JOIN 
    (SELECT YEAR(sth_tarih) Yil, MONTH(sth_tarih) Ay, sth_vergi KDV_Orani,
            SUM(CASE WHEN sth_normal_iade=0 THEN sth_tutar ELSE -sth_tutar END) Matrah,
            SUM(CASE WHEN sth_normal_iade=0 THEN sth_tutar*sth_vergi/100.0 ELSE -sth_tutar*sth_vergi/100.0 END) KDV_Tutari
     FROM STOK_HAREKETLERI
     WHERE sth_iptal=0 AND sth_evraktip=3 
       AND sth_tarih>='20260101' AND sth_tarih<'20270101'
     GROUP BY YEAR(sth_tarih), MONTH(sth_tarih), sth_vergi) a 
    ON s.Yil=a.Yil AND s.Ay=a.Ay AND s.KDV_Orani=a.KDV_Orani
ORDER BY s.Yil, s.Ay, s.KDV_Orani;

Alış tarafında ilgili ay/vergide kayıt yoksa LEFT JOIN sayesinde NULL değerler 0 olarak değerlendirilir.

Hesaplanan KDV Tutarında Yuvarlama Farkı

sth_vergi ve sth_tutar float tiptedir; çarpım sonucu kayan nokta yuvarlaması nedeniyle kuruş seviyesinde resmî beyanlardan farklı görünebilir. Örneğin, 0,20 KDV oranıyla 14,75 matrahtan 2,95 yerine 2,9500000000000002 gibi bir değer çıkabilir. Bu fark mali açıdan önemsizdir ancak tam eşleşme bekleniyorsa ROUND(... ,2) fonksiyonu kullanılabilir. Kesin mutabakat için Mikro'nun kendi Beyanname raporunu esas almanızı öneririz.

Sık yapılan hatalar

  • sth_iptal = 0 filtresini unutmak: İptal edilmiş hareketler rapora istenmeyen tutarlar ekler.
  • sth_evraktip filtresini atlamak: Satış veya alış dışındaki hareket türleri (sayım, fire vb.) hatalı toplamlara yol açar.
  • İade satırlarını düşmemek: sth_normal_iade = 1 olan satırlar ters işaretle toplama dahil edilmezse KDV ve matrah şişer.
  • KDV tutarını doğrudan yanlış alanlardan çekmeye çalışmak: sth_vergi oran olduğu için tutar çarpılarak elde edilmelidir; aksi takdirde sadece oranlar toplanır.
  • Tarih filtresi koymamak: Tüm yılların verisi gelir, sorgu performansı düşer.

Sık sorulanlar

Sorguda tarih aralığını nasıl değiştiririm?
WHERE koşulundaki '20260101' ve '20270101' değerlerini kendi döneminize göre güncelleyin. Örneğin, 2025 yılı için '20250101' ve '20260101' kullanın.

KDV oranı 0 olan satırlar neden var?
İstisna, vergisiz teslim veya KDV'siz işlemler için sth_vergi 0 olabilir. Bu satırlar ayrı bir grupta listelenir, rapordan çıkarmak isterseniz WHERE koşuluna AND sth_vergi > 0 ekleyin.

Sorguyu Excel'e nasıl aktarırım?
SQL Server Management Studio (SSMS) sonuç ızgarasından kopyala-yapıştır yapabilirsiniz. Erp Asistanı'nda sorguyu çalıştırdığınızda sonuç tablo olarak gelir ve tek tıkla Excel indirebilirsiniz.

Bu sorgular Mikro v16'da da çalışır mı?
Evet, v16 ve v17'deki STOK_HAREKETLERI tablo şeması aynıdır; yalnızca firma/şube yapınıza göre ek filtre gerekebilir. Emin değilseniz v16/v17 farkları yazısına bakın.


Bu rehberdeki sorgularla KDV raporlarınızı hızlıca çıkarabilirsiniz. Daha karmaşık ihtiyaçlar için (örneğin plasiyer bazlı KDV, dövizli faturalar) Erp Asistanı'na ücretsiz üye olun, doğal dille istediğiniz sorguyu yazın; anında çalışan SQL'e dönüşsün.

Ücretsiz üye olun, sorgunuzu doğal dille üretin →

Bu yazıyı paylaş
Konuşarak raporlayın

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.