PIVOT / UNPIVOT (satır↔sütun)
Oracle
-- Aylara göre satışları sütunlara çevir
SELECT * FROM (
SELECT ay, tutar FROM satis
)
PIVOT (SUM(tutar) FOR ay IN ('Oca' AS ocak, 'Sub' AS subat, 'Mar' AS mart));
-- UNPIVOT: sütunları tekrar satıra çevir
SELECT urun, ay, tutar
FROM satis_genis
UNPIVOT (tutar FOR ay IN (ocak AS 'Oca', subat AS 'Sub'));PIVOT satırlardaki farklı değerleri sütunlara (çapraz tablo), UNPIVOT ise sütunları tekrar satırlara çevirir; özet/rapor tablolarında kullanılır. Oracle 11g'den beri yerleşik PIVOT/UNPIVOT operatörlerini sunar; sütun listesi statik olmalıdır (dinamik için PIVOT XML veya kod gerekir).
PostgreSQL
-- crosstab için tablefunc eklentisi
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT * FROM crosstab(
'SELECT urun, ay, tutar FROM satis ORDER BY 1,2'
) AS ct(urun text, ocak numeric, subat numeric, mart numeric);
-- Eklentisiz yol: koşullu toplama
SELECT urun,
SUM(tutar) FILTER (WHERE ay = 'Oca') AS ocak,
SUM(tutar) FILTER (WHERE ay = 'Sub') AS subat
FROM satis GROUP BY urun;PostgreSQL'de yerleşik PIVOT operatörü yoktur. İki yol vardır: tablefunc eklentisinin crosstab() fonksiyonu veya taşınabilir olan koşullu toplama (SUM(...) FILTER (WHERE ...) ya da CASE ile). FILTER yan tümcesi PostgreSQL'e özgü şık bir pivot yöntemidir.
MySQL
-- PIVOT yoktur; manuel CASE ile koşullu toplama
SELECT urun,
SUM(CASE WHEN ay = 'Oca' THEN tutar ELSE 0 END) AS ocak,
SUM(CASE WHEN ay = 'Sub' THEN tutar ELSE 0 END) AS subat,
SUM(CASE WHEN ay = 'Mar' THEN tutar ELSE 0 END) AS mart
FROM satis
GROUP BY urun;MySQL/MariaDB'de PIVOT/UNPIVOT operatörü yoktur; çapraz tablo GROUP BY ile birlikte her hedef sütun için SUM(CASE WHEN ... THEN ... END) yazılarak elle kurulur. Sütunlar dinamikse sorgu, prepared statement ile string olarak üretilir.
SQL Server
SELECT * FROM (
SELECT urun, ay, tutar FROM satis
) src
PIVOT (
SUM(tutar) FOR ay IN ([Oca], [Sub], [Mar])
) pvt;
-- UNPIVOT ile geri çevirme de desteklenirSQL Server 2005'ten beri PIVOT ve UNPIVOT operatörlerini yerleşik olarak destekler. PIVOT sütun listesi statik köşeli parantezli değerlerle verilir; dinamik sütunlar için sorgu dinamik SQL ile oluşturulur. Küçük özetlerde koşullu toplama (CASE) da alternatiftir.
MongoDB
// PIVOT karşılığı: $group içinde koşullu toplama
db.satis.aggregate([
{ $group: {
_id: "$urun",
ocak: { $sum: { $cond: [ { $eq: ["$ay", "Oca"] }, "$tutar", 0 ] } },
subat: { $sum: { $cond: [ { $eq: ["$ay", "Sub"] }, "$tutar", 0 ] } }
} }
])MongoDB'de PIVOT operatörü yoktur; çapraz tablo $group aşamasında her hedef sütun için $sum + $cond (koşullu toplama) ile kurulur. Ters yön (UNPIVOT) için $objectToArray ve $unwind ile alanlar satırlara açılır.
Redis
# Uygulanamaz: Redis'te pivot/çapraz tablo yoktur.Redis'te satır-sütun döndürme kavramı yoktur. Özet/çapraz tablolar uygulama tarafında hesaplanır; sık istenen özetler önceden hesaplanıp Hash alanlarında (her sütun bir alan) saklanabilir. RediSearch FT.AGGREGATE ile gruplu toplama yapılabilir ama gerçek pivot değildir.
Elasticsearch
# En yakın karşılık: iç içe terms agregasyonları
GET satis/_search
{
"size": 0,
"aggs": { "urun": { "terms": { "field": "urun" },
"aggs": { "ay": { "terms": { "field": "ay" },
"aggs": { "toplam": { "sum": { "field": "tutar" } } } } } }
}Elasticsearch'te PIVOT operatörü yoktur; çapraz özet iç içe terms agregasyonlarıyla (dış anahtar / iç anahtar) kurulur, sonuç sütun değil iç içe bucket olarak döner ve istemcide tabloya çevrilir. Transform işi ise gruplu pivot benzeri hedef index üretebilir.