# 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