Neden uzun format?
Lezzet Kurye değerlendirmelerinde iki puan iki ayrı sütunda durur: food_score ve courier_score. “Hangi puan türünün ortalaması daha düşük?”, “Her puan türünde 1 verenlerin oranı?” gibi sorular, puanlar tek sütunda ve türü ayrı bir sütunda olduğunda tek bir GROUP BY ile cevaplanır. Görselleştirme araçları da çoğunlukla uzun format ister.
| order_id | food_score | courier_score |
|---|---|---|
| 12 | 5 | 4 |
↓
| order_id | tur | puan |
|---|---|---|
| 12 | yemek | 5 |
| 12 | kurye | 4 |
Yol 1: UNION ALL (her yerde çalışır)
SELECT order_id, 'yemek' AS tur, food_score AS puan FROM lk_ratings UNION ALL SELECT order_id, 'kurye', courier_score FROM lk_ratings;
Tabloyu her sütun için bir kez okur. Sütun sayısı azsa en okunur yoldur.
Yol 2: sabit listeyle CROSS JOIN
SELECT r.order_id, t.tur,
CASE t.tur WHEN 'yemek' THEN r.food_score ELSE r.courier_score END AS puan
FROM lk_ratings r
CROSS JOIN (SELECT 'yemek' AS tur UNION ALL SELECT 'kurye') t;
Tabloyu bir kez okur; her satırı tür sayısı kadar çoğaltıp CASE ile doğru sütunu seçer.
Yol 3: SQL türüne özgü operatörler
- SQL Server ve Oracle:
UNPIVOT (puan FOR tur IN (food_score, courier_score)) - BigQuery:
UNPIVOT (puan FOR tur IN (food_score, courier_score)) - PostgreSQL:
CROSS JOIN LATERAL (VALUES ('yemek', food_score), ('kurye', courier_score)) v(tur, puan)