Uzun formattan geniş formata
Raporlarda sıklıkla “satırda kategori, sütunda yıl” gibi çapraz tablolar istenir. Standart SQL'de bunun en taşınabilir yolu koşullu toplamadır:
SELECT p.category,
ROUND(SUM(CASE WHEN o.order_date LIKE '2023%' THEN oi.quantity * oi.unit_price * (1 - oi.discount) ELSE 0 END)) AS ciro_2023,
ROUND(SUM(CASE WHEN o.order_date LIKE '2024%' THEN oi.quantity * oi.unit_price * (1 - oi.discount) ELSE 0 END)) AS ciro_2024
FROM order_items oi
JOIN orders o ON o.order_id = oi.order_id
JOIN products p ON p.product_id = oi.product_id
WHERE o.status = 'delivered'
GROUP BY p.category
ORDER BY ciro_2024 DESC;
SQL Server ve Oracle'da PIVOT operatörü, PostgreSQL'de crosstab() eklentisi vardır; ama koşullu toplama her yerde çalışır.
Unpivot: tersine çevirmek
Geniş tabloyu uzun formata çevirmek için UNION ALL kullanılır:
WITH genis AS (SELECT 'Elektronik' AS kat, 10 AS q1, 14 AS q2) SELECT kat, 'Q1' AS ceyrek, q1 AS deger FROM genis UNION ALL SELECT kat, 'Q2', q2 FROM genis;
Derinleş: pivotun sınırı
Koşullu toplama ile pivotta sütunlar önceden bilinmelidir. Yeni bir durum değeri eklenirse (ör. “kısmi iade”) sorgu onu sessizce dışarıda bırakır. Kontrol için toplamları karşılaştır: pivot sütunlarının toplamı satır sayısına eşit mi?
SELECT COUNT(*) AS toplam,
SUM(CASE WHEN status IN ('teslim', 'iptal', 'iade') THEN 1 ELSE 0 END) AS pivottaki
FROM lk_orders;