Sql İle Karmaşık Veri Raporlama Sorgusu Nasıl Yapılır?

Sql İle Karmaşık Veri Raporlama Sorgusu Nasıl Yapılır?
Sql İle Karmaşık Veri Raporlama Sorgusu Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Karmaşık raporlama sorguları üzerinde çalışabilmek için güncel bir ilişkisel veritabanı yönetim sistemi (RDBMS) kullanmanız gerekmektedir. 2026 standartlarına uygun olarak PostgreSQL 16+, MySQL 8.4+ veya SQL Server 2022 gibi modern sistemler, bu makaledeki tüm fonksiyonları destekler.

  • Veritabanı Motoru: ANSI SQL standartlarını destekleyen güncel bir sürüm.
  • Veri Seti: İlişkili tablolar (Örn: Siparişler, Müşteriler, Ürünler).
  • Araçlar: DBeaver, pgAdmin veya SQL Server Management Studio gibi bir sorgu arayüzü.

Adım Adım Ortak Tablo İfadeleri (CTE) Kullanımı

Karmaşık sorguları daha okunabilir ve yönetilebilir kılmanın en iyi yolu CTE (Common Table Expression) kullanmaktır. CTE, sorgu içerisinde geçici bir sonuç kümesi oluşturmanıza olanak tanır. Aşağıdaki örnekte, her kategorideki toplam satış miktarını hesaplayan bir yapı kuruyoruz.

WITH KategoriSatis AS (
    SELECT 
        kategori_id, 
        SUM(tutar) as toplam_satis
    FROM siparisler
    GROUP BY kategori_id
)
SELECT k.ad, ks.toplam_satis
FROM kategoriler k
JOIN KategoriSatis ks ON k.id = ks.kategori_id
WHERE ks.toplam_satis > 10000;

Bu sorguda, WITH anahtar kelimesi ile KategoriSatis adında sanal bir tablo oluşturduk. Bu yöntem, karmaşık alt sorguların (subquery) iç içe geçmesini engelleyerek kodun bakımını kolaylaştırır.

Pencere Fonksiyonları ile Sıralı Analizler

Raporlama sorgularında genellikle "bir önceki aya göre değişim" veya "toplam içerisindeki pay" gibi veriler istenir. Pencere fonksiyonları (Window Functions), satırları gruplandırmadan (GROUP BY kullanmadan) hesaplama yapmanızı sağlar.

SELECT 
    tarih, 
    tutar,
    SUM(tutar) OVER (ORDER BY tarih) as kümülatif_toplam,
    AVG(tutar) OVER (ORDER BY tarih ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as hareketli_ortalama
FROM satislar;

Burada SUM() OVER ifadesi, verileri tarih sırasına göre kümülatif olarak toplar. ROWS BETWEEN ifadesi ise son üç satırın hareketli ortalamasını alarak trend analizi yapmanıza olanak tanır.

Karmaşık Join Senaryoları ve Veri Bütünlüğü

Raporlama yaparken eksik veriler (örneğin hiç satış yapmayan müşteriler) raporun doğruluğunu bozabilir. LEFT JOIN ve COALESCE kullanarak bu durumu yönetebiliriz. COALESCE fonksiyonu, null değerleri istediğiniz bir varsayılan değerle (genellikle 0) değiştirir.

SELECT 
    m.ad, 
    COALESCE(SUM(s.tutar), 0) as toplam_harcama
FROM musteriler m
LEFT JOIN siparisler s ON m.id = s.musteri_id
GROUP BY m.id, m.ad;

Bu sorgu, siparişi olmayan müşterileri de listeye dahil eder ve toplam harcamalarını 0 olarak gösterir. Bu, müşteri segmentasyonu raporlarında hayati önem taşır.

Performans Odaklı Sorgu Optimizasyonu

Büyük veri setlerinde raporlama yaparken sorgu süresi uzayabilir. Performansı artırmak için indeksleme ve filtreleme stratejileri kullanılmalıdır. Aşağıdaki tabloda, raporlama yöntemlerinin karşılaştırmasını bulabilirsiniz.

Yöntem Avantaj Dezavantaj
CTE Okunabilirlik Çok büyük veride yavaş olabilir
Pencere Fonksiyonu Analitik esneklik Bellek kullanımı yüksek olabilir
Temp Table Performans Yönetimi daha zor

Güvenlik ve SQL Injection Önlemleri

Kritik Uyarı: Raporlama sorgularını uygulama kodunuza (PHP, Python, Java vb.) entegre ederken asla kullanıcıdan gelen veriyi doğrudan sorguya eklemeyin. Her zaman "Prepared Statements" (Hazırlanmış İfadeler) kullanın. SQL Injection, veritabanınızın tüm içeriğinin çalınmasına veya silinmesine neden olabilir.
-- Yanlış Kullanım (SQL Injection Riski)
-- "SELECT * FROM rapor WHERE yil = " + kullanici_girdisi;

-- Doğru Kullanım (Parametreli Sorgu - Örnek: PostgreSQL)
PREPARE rapor_sorgu(int) AS
SELECT * FROM satislar WHERE yil = $1;
EXECUTE rapor_sorgu(2026);

Sıkça Sorulan Sorular

CTE kullanmak sorguyu yavaşlatır mı?

Modern veritabanı motorları CTE'leri genellikle optimize eder. Ancak çok büyük veri setlerinde, CTE yerine geçici tablolar (Temporary Tables) kullanmak performans artışı sağlayabilir.

Pencere fonksiyonları her veritabanında çalışır mı?

2026 itibariyle neredeyse tüm popüler ilişkisel veritabanları (PostgreSQL, MySQL 8+, SQL Server, Oracle) pencere fonksiyonlarını desteklemektedir.

Raporlama sorgularında neden GROUP BY hatası alıyorum?

SELECT kısmında kullandığınız her sütun, ya bir toplama fonksiyonu (SUM, AVG) içinde olmalı ya da GROUP BY bloğunda yer almalıdır.

Kümülatif toplamı en hızlı nasıl alırım?

Pencere fonksiyonları (OVER ORDER BY) bu işlem için standart ve en performanslı yöntemdir.

Büyük veritabanlarında raporlama için indeksleme şart mı?

Evet, WHERE ve JOIN koşullarında kullanılan sütunlara mutlaka indeks (index) eklenmelidir, aksi takdirde sorgu tüm tabloyu tarar (Full Table Scan).

Raporlama Sorgularında Hata Ayıklama ve İzleme (Debugging)

Karmaşık SQL sorguları yazarken karşılaşılan en büyük zorluklardan biri, beklenen sonucun alınamadığı durumlarda hatanın nerede olduğunu bulmaktır. Özellikle iç içe geçmiş CTE yapıları ve çoklu JOIN işlemleri, veri setinin nerede daraldığını veya yanlış eşleştiğini görmeyi zorlaştırır.

Adım Adım İzole Etme Tekniği

Sorgunuzu tek bir blok halinde çalıştırmak yerine, her bir CTE aşamasını ayrı ayrı sorgulayarak veri setini kontrol etmelisiniz. Örneğin, ana sorgunuzda LEFT JOIN kullanıyorsanız, önce sadece sağdaki tabloyu SELECT * ile çağırarak eşleşme kriterlerinizin doğruluğunu teyit edin.

-- Hata ayıklama için CTE'yi parçalara ayırın
WITH Satislar AS (
    SELECT musteri_id, SUM(tutar) as toplam_satis
    FROM siparisler
    GROUP BY musteri_id
)
-- Sadece bu bloğu çalıştırarak veriyi doğrulayın
SELECT * FROM Satislar WHERE toplam_satis > 1000;

Execution Plan (Çalıştırma Planı) Analizi

Veritabanı motorunun sorgunuzu nasıl işlediğini görmek için EXPLAIN ANALYZE (PostgreSQL) veya SET STATISTICS IO ON (SQL Server) komutlarını kullanın. Bu araçlar, sorgunun hangi adımda "Index Scan" yerine "Table Scan" yaptığını veya hangi JOIN türünün (Nested Loop, Hash Match) maliyetli olduğunu size raporlar.

Raporlama Sorgularını Otomatize Etme ve Deployment

Hazırladığınız karmaşık sorguları her seferinde manuel çalıştırmak yerine, bunları veritabanı nesneleri olarak saklamak sürdürülebilirlik açısından kritiktir. Ancak, her rapor için fiziksel tablo oluşturmak yerine "Materialized View" veya "Stored Procedure" yapılarını tercih etmelisiniz.

Materialized View Kullanımı

Eğer raporunuz milyonlarca satırı işliyorsa ve verinin her saniye güncel olması gerekmiyorsa, MATERIALIZED VIEW kullanarak sorgu sonucunu fiziksel olarak diske kaydedebilirsiniz. Bu, sorgu süresini dakikalardan milisaniyelere indirebilir.

-- Materialized View oluşturma örneği
CREATE MATERIALIZED VIEW mv_aylik_satis_raporu AS
SELECT 
    DATE_TRUNC('month', siparis_tarihi) as ay,
    kategori_id,
    SUM(tutar) as aylik_ciro
FROM siparisler
GROUP BY 1, 2;

-- Veriyi güncellemek için
REFRESH MATERIALIZED VIEW mv_aylik_satis_raporu;

Stored Procedure ile Parametrik Raporlama

Raporları dinamik hale getirmek için Stored Procedure kullanmak, hem güvenlik hem de performans sağlar. Kullanıcıdan alınan tarih aralığı gibi parametreleri güvenli bir şekilde sorguya dahil edebilirsiniz.

CREATE PROCEDURE sp_get_kategori_raporu(baslangic_tarihi DATE, bitis_tarihi DATE)
LANGUAGE plpgsql
AS $$
BEGIN
    SELECT kategori_adi, SUM(tutar)
    FROM satislar
    WHERE tarih BETWEEN baslangic_tarihi AND bitis_tarihi
    GROUP BY kategori_adi;
END;
$$;

Bu yöntemle, raporlama aracınız sadece prosedürü tetikler ve veritabanı sunucusu hesaplamayı kendi tarafında yaparak sadece sonucu döndürür. Bu, ağ trafiğini azaltır ve uygulamanızın daha hızlı yanıt vermesini sağlar.

Sonuç

SQL ile karmaşık veri raporlama sorgusu oluşturmak, veriyi anlamlı bir bilgiye dönüştürme sanatıdır. CTE'lerin sağladığı yapısal düzen, pencere fonksiyonlarının sunduğu analitik güç ve doğru JOIN stratejileri ile profesyonel raporlar hazırlayabilirsiniz. Bir sonraki adım olarak, oluşturduğunuz bu sorguları veritabanı üzerinde "View" (Görünüm) olarak tanımlayarak, raporlama araçlarınızın (Power BI, Tableau vb.) bu verilere daha hızlı erişmesini sağlayabilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce mutlaka veritabanı yedeği almalı ve güvenlik testlerini gerçekleştirmelisiniz.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve sürdürülebilir yaşam ipuçları üzerine odaklanıyorum. Okuyucularıma bütçe dostu ve yaratıcı çözüm önerileri sunmaktan keyif alıyorum.

Yorumlar (0)

Yorum Yaz