Takip et

PostgreSQL: Sütündaki Toplamın Yüzdesini Hesaplama

# PostgreSQL’de Toplamın Yüzdesini Hesaplama: Adım Adım Kılavuz

PostgreSQL veritabanınızda toplam değerlere göre yüzdeleri hesaplamanız mı gerekiyor? Örneğin, her ürünün toplam satışlardaki payını veya her bölgenin toplam müşteri sayısındaki oranını bulmak istiyor olabilirsiniz. Bu makale, PostgreSQL’de bu hesaplamaları yapmanın farklı yöntemlerini, performans optimizasyonunu ve olası sorunları adım adım açıklayarak size uzman seviyesinde bir rehber sunacaktır. Veri analizi ve raporlama süreçlerinizi iyileştirmek için ihtiyacınız olan tüm bilgileri bulacaksınız.

PostgreSQL’de Yüzde Hesaplamanın Temelleri

PostgreSQL’de toplamın yüzdesini hesaplamak için temel SQL fonksiyonlarını kullanırız. Bunların başında SUM(), COUNT(), ve AVG() gibi agrega fonksiyonları gelir. Ayrıca, yüzdeleri hesaplamak için standart aritmetik operatörleri (/ ve *) ve ROUND() fonksiyonu (sonucu yuvarlamak için) kullanırız. Temel olarak, bir sütunun toplamını bulur, her satırın değerini bu toplama böler ve sonucu 100 ile çarparız.

Örneğin, basit bir sales tablomuz olduğunu düşünelim:

| product | sales |
|—|—|
| A | 100 |
| B | 200 |
| C | 300 |

Bu tablodaki her ürünün toplam satışlardaki yüzdesini hesaplamak için aşağıdaki sorguyu kullanabiliriz:

SELECT
    product,
    sales,
    (sales::numeric / SUM(sales::numeric) OVER ()) * 100 AS sales_percentage
FROM
    sales;

Bu sorgu, SUM(sales::numeric) OVER () ile tüm satışların toplamını hesaplar ve her satır için bu toplama göre yüzdesini belirler. ::numeric dönüşümü, tam sayı bölmesinden kaynaklanabilecek olası yuvarlama hatalarını önlemek için kullanılmıştır. OVER() pencere fonksiyonu, tüm satırlar üzerinde toplamı hesaplamamızı sağlar.

PostgreSQL’de Yüzde Hesaplama: Uygulamalı Kılavuz

Şimdi, farklı karmaşıklık seviyelerine sahip örneklerle konuyu daha detaylı inceleyelim.

# Yeni Başlayanlar İçin Adım Adım Açıklama: Basit Kod Örneği

Bir öğrenci notları tablosunda her öğrencinin sınıf ortalamasına göre yüzdesini hesaplayalım:

CREATE TABLE student_grades (
    student_name TEXT,
    grade INTEGER
);

INSERT INTO student_grades (student_name, grade) VALUES
('Ahmet', 80),
('Ayşe', 90),
('Mehmet', 75),
('Fatma', 85);

SELECT
    student_name,
    grade,
    (grade::numeric / AVG(grade::numeric) OVER ()) * 100 AS grade_percentage
FROM
    student_grades;

Bu kod, öncelikle student_grades tablosunu oluşturur ve verileri ekler. Ardından, AVG(grade::numeric) OVER() ile tüm notların ortalamasını hesaplar ve her öğrencinin notunun bu ortalamaya göre yüzdesini hesaplar.

# Orta Seviye: Gerçek Hayat Örneği ve Optimizasyon İpuçları

Bir e-ticaret şirketinde, her ürün kategorisinin toplam satışlardaki payını hesaplamamız gerekiyor. Ürünler ve satışları içeren bir products tablosu olduğunu varsayalım:

CREATE TABLE products (
    product_id INTEGER PRIMARY KEY,
    category TEXT,
    sales_amount NUMERIC
);

-- ... (Veri ekleme işlemleri) ...

Aşağıdaki sorgu, her kategorinin toplam satışlardaki yüzdesini hesaplar:

SELECT
    category,
    SUM(sales_amount) AS total_sales_category,
    (SUM(sales_amount)::numeric / SUM(SUM(sales_amount)) OVER ()) * 100 AS percentage
FROM
    products
GROUP BY
    category;

Bu sorgu, GROUP BY kullanarak kategorilere göre satışları toplar ve daha sonra her kategorinin toplam satışlara göre yüzdesini hesaplar. Performansı artırmak için uygun indeksler oluşturmak önemlidir. Örneğin, category ve sales_amount sütunlarına indeks eklemek sorgu performansını iyileştirebilir.

# İleri Düzey: Performans Analizi ve Edge Case’ler

Çok büyük veri kümeleriyle çalışırken, yukarıdaki sorguların performansı düşebilir. Bu durumda, materyalize görünümler (MATERIALIZED VIEW) kullanarak önceden hesaplanmış yüzdeleri saklamak performansı önemli ölçüde artırabilir. Ayrıca, WITH deyimi kullanarak sorguları daha okunabilir ve optimize edilebilir hale getirebiliriz.

Örneğin:

WITH CategorySales AS (
    SELECT
        category,
        SUM(sales_amount) AS total_sales_category
    FROM
        products
    GROUP BY
        category
),
TotalSales AS (
    SELECT SUM(total_sales_category) AS grand_total FROM CategorySales
)
SELECT
    cs.category,
    cs.total_sales_category,
    (cs.total_sales_category::numeric / ts.grand_total) * 100 AS percentage
FROM
    CategorySales cs
CROSS JOIN
    TotalSales ts;

Bu yaklaşım, öncelikle kategorilere göre toplam satışları hesaplar ve daha sonra bu toplamı genel toplamla karşılaştırır. Bu, büyük veri kümeleri için daha verimli olabilir. Ayrıca, sıfır değerleri ve boş kategorileri ele almak için ek kontroller eklemek gerekebilir. CASE deyimi veya COALESCE() fonksiyonu bu gibi durumlarda yardımcı olabilir.

PostgreSQL’de Yüzde Hesaplama: Öğrenme Yol Haritası

Yeni Başlayan: Basit bir tablo üzerinde, AVG() veya SUM() fonksiyonlarını kullanarak toplamın yüzdesini hesaplamak. Yukarıdaki basit öğrenci notları örneği ideal bir başlangıç noktasıdır.

Orta Seviye: Gerçek dünya senaryoları (örneğin, e-ticaret verileri) üzerinde, GROUP BY ve pencere fonksiyonlarını kullanarak yüzdeleri hesaplamak. İndeksleme ve sorgu optimizasyonu tekniklerini uygulamak.

İleri Seviye: Çok büyük veri kümeleri için materyalize görünümler ve WITH deyimini kullanarak performansı optimize etmek. Sıfır değerleri ve boş verileri ele almak için CASE deyimi ve COALESCE() fonksiyonunu kullanmak. Performans analizi araçlarını kullanarak sorgu performansını izlemek ve iyileştirmek.

Sonuç

PostgreSQL’de toplamın yüzdesini hesaplamak için çeşitli yöntemler mevcuttur. Seçtiğiniz yöntem, veri kümenizin büyüklüğü ve karmaşıklığına bağlıdır. Bu makalede sunulan adımlar ve örnekler, farklı karmaşıklık seviyelerindeki sorunları çözmenize yardımcı olacaktır. Veri analizi ve raporlamada daha etkili olmak için bu teknikleri uygulamanız ve sürekli olarak öğrenmenizi tavsiye ederim. Daha fazla bilgi için [fatihsoysal.com](https://fatihsoysal.com) adresini ziyaret edebilirsiniz.

Sıkça Sorulan Sorular:

1. Yüzde hesaplamalarında yuvarlama hataları nasıl önlenir? NUMERIC veri tipi kullanarak ve ROUND() fonksiyonu ile yuvarlayarak yuvarlama hatalarını minimize edebilirsiniz.

2. Çok büyük veri kümeleri için performansı nasıl artırabilirim? Materyalize görünümler, indeksleme ve sorgu optimizasyonu teknikleri kullanın.

3. Sıfır değerleriyle nasıl başa çıkabilirim? CASE deyimi veya COALESCE() fonksiyonu kullanarak sıfır değerlerini ele alabilirsiniz.

4. Boş kategorilerle nasıl başa çıkabilirim? COALESCE() fonksiyonu veya CASE deyimi kullanarak boş kategorileri yönetebilirsiniz.

5. Pencere fonksiyonları nedir ve ne zaman kullanılır? Pencere fonksiyonları, bir veri kümesinin alt kümelerinde agrega işlemlerini gerçekleştirmenizi sağlar. Toplamın yüzdesini hesaplamak gibi durumlarda oldukça kullanışlıdırlar.

Yazar: Fatih Soysal

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.