Ana içeriğe geç
Kesit SQL
Orta · İleri Sorgu Yapıları

Pivot: satırları sütuna çevirmek

Koşullu toplama ile çapraz tablo raporları.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
Alıştırmalara geç (6)