Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi
SQL Server PIVOT ve Postgres crosstab kullanımı ve bunların sınırlamaları.
Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.
Koşullu Toplamanın Ötesi
Taşınabilir CASE çapraz tablo yaklaşımını artık biliyorsunuz. Ancak görüşmeciler, üreticiye özgü çapraz tablo işleçleri kullanılabilir olduğunda bunları kullanıp kullanamayacağınızı da bilmek ister.
SQL Server özel bir PIVOT işleci sunar. PostgreSQL ise tablefunc eklentisinde bir crosstab işlevi sunar. Her ikisini ve sorun çıkarabilecek yönlerini bilmeniz, gerçek dünya deneyiminiz olduğunu gösterir.
SQL Server PIVOT Yapısı
SQL Server'ın PIVOT işleci üç şey alır:
- Değer sütunu üzerinde bir toplama işlevi.
- Değerleri yeni sütunlara dönüşecek sütunu belirten bir
FORyan tümcesi. - Sütunlara dönüştürülecek sabit değerlerin yer aldığı bir
INlistesi.
Bu işleç, yalnızca anahtarı, açılım sütununu ve değeri (başka hiçbir şeyi değil) sunan türetilmiş bir tabloya uygulanmalıdır.
SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
SUM(amount)
FOR quarter IN ([Q1], [Q2])
) AS p;Örtük GROUP BY
Görüşmecilerin sınadığı ince bir PIVOT ayrıntısı şudur: gruplama örtüktür. SQL Server, kaynakta toplama işlemine tabi sütun veya FOR sütunu olmayan her sütuna göre gruplar.
Bu nedenle türetilmiş tablonuz yanlışlıkla order_id gibi fazladan bir sütun içerirse, çapraz tablo bu sütuna göre de gruplar ve beklediğinizden çok daha fazla satır elde edersiniz. İç sorguyu her zaman yalnızca anahtar, açılım sütunu ve değer olacak şekilde daraltın.
-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_idKöşeli Parantezli Sütun Adları
SQL Server'da çapraz tabloya dönüştürülen sütun adları, verideki sabit değerlerdir ve köşeli parantez içine alınır. Bir değer rakamla başlıyorsa veya boşluk içeriyorsa köşeli parantezler zorunludur.
Dıştaki SELECT içinde bunları aynı köşeli parantezli adla seçersiniz. PIVOT işlecinin dinamik SQL olmadan bilinmeyen değerleri işleyememesinin nedeni de budur: IN listesi sabit kodlanmıştır.
SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;PostgreSQL Çapraz Tablosu
PostgreSQL'de PIVOT anahtar sözcüğü yoktur. Bunun yerine tablefunc eklentisi, bir SQL dizesi alan ve çıktısını yeniden şekillendiren crosstab işlevini sağlar.
Önce eklentiyi etkinleştirmeniz gerekir. crosstab, kaynak sorgunun tam olarak şu üç sütunu bu sırayla döndürmesini bekler: satır tanımlayıcısı, kategori ve değer.
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);Sütun Tanım Listesi
crosstab işlevinin en çok hataya açık kısmı, sondaki AS ct(...) sütun tanım listesidir. Çıktı sütunlarının adlarını ve türlerini kendiniz bildirmelisiniz; bunlar kategori sayısıyla ve sırasıyla eşleşmelidir.
Bir satırda bir kategori eksikse çapraz tablo işlevi onu konuma göre doldurur. Bu durum, aşağıdaki iki bağımsız değişkenli biçimi kullanmadığınızda verilerin yanlış hizalanmasına yol açabilir.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its typeİki Bağımsız Değişkenli Çapraz Tablo
Bazı satırlarda bazı kategoriler eksik olduğunda oluşan yanlış hizalamayı önlemek için iki bağımsız değişkenli biçimi kullanın. İkinci sorgu, kategori değerlerinin sıralanmış tam listesini döndürür; böylece çapraz tablo işlevi her değerin tam olarak hangi sütuna ait olduğunu bilir.
Kategorilerin seyrek olduğu durumlarda görüşmecilerin beklediği sağlam biçim budur.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);MySQL'de İkisi de Yok
Görüşmeci MySQL'i sorarsa yanıt doğrudandır: MySQL'de PIVOT ve çapraz tablo işlevi yoktur. Buradaki tek seçeneğiniz CASE ile koşullu toplama yapmaktır (veya SUM(... ) + IF() kısaltmasını kullanmaktır).
Taşınabilir CASE kalıbına bu kadar değer verilmesinin nedeni tam olarak budur: her yerde çalışan en ortak çözümdür.
-- MySQL: only conditional aggregation works
SELECT
region,
SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;Uygulamalı Örnek: SQL Server'da Durum Sayımları
Bir raporlama gereksinimi şöyle olsun: "Her bölge için bir satır ve her durumdaki siparişleri sayan bir sütun." SQL Server'da daraltılmış bir türetilmiş tabloyu COUNT kullanarak PIVOT işlecine besleyin.
Durum sütununun kendisini saydığınız için, bir gruptaki NULL olmayan her durum satırı sayılır. Dıştaki SELECT her durumu köşeli parantezli bir sütun olarak listeler. Bu, üç ayrı COUNT(CASE ...) ifadesi yazmaya göre daha kısa bir seçenektir.
SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
COUNT(status)
FOR status IN ([pending], [shipped], [delivered])
) AS p;Ortak Sınırlamalar
PIVOT ve crosstab işlevlerinin ikisi de koşullu toplamayla aynı temel sınırlamayı paylaşır: çıktı sütunları sorguyu yazdığınız sırada bilinmelidir.
- SQL Server:
INlistesi sabittir. - PostgreSQL çapraz tablo işlevi: sütun tanım listesi sabittir.
İkisi de kategorileri çalışma zamanında keşfedemez. Bunun için SQL dizesini dinamik olarak oluşturmak gerekir.
Hangisini Kullanmalısınız?
İyi bir mülakat yanıtı, seçenekleri dürüstçe karşılaştırır:
CASEile toplama: taşınabilirdir, okunaklıdır ve her veritabanı altyapısında çalışır. Varsayılan seçenektir.- SQL Server PIVOT: çok sayıda sütun için kısadır; ancak örtük gruplaması insanları şaşırtır.
- PostgreSQL çapraz tablo işlevi: güçlüdür ancak uzundur; bir eklenti ve sütun tanım listesi gerektirir.
Emin olmadığınızda koşullu toplamayı tercih edin ve üreticiye özgü işleçlerden alternatifler olarak söz edin.
Kısa Kontrol
Görüşmecilerin sınadığı SQL Server PIVOT davranışını netleştirin.
Özet
Üreticiye özgü çapraz tablo söz dizimi tek ekranda:
- SQL Server:
PIVOT (SUM(x) FOR col IN ([a],[b])); geriye kalan sütunlar üzerinde örtük bir GROUP BY uygulanır. - PostgreSQL:
tablefunciçindencrosstab(); bir sütun tanım listesi gerekir, seyrek veriler için iki bağımsız değişkenli biçimi kullanın. - MySQL: ikisi de yoktur,
CASEkullanın. - Üçünde de sütunların sorgu yazılırken bilinmesi gerekir.
Sıkça Sorulan Sorular
“Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi” dersi ücretsiz mi?
Evet — “Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.
“Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi” dersinde ne öğreneceğim?
SQL Server PIVOT ve Postgres crosstab kullanımı ve bunların sınırlamaları. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Koşullu Toplama ile Döndürme
- Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi
- Sütunları Satırlara Dönüştürme
- Bilinmeyen Sütunlarla Dinamik Döndürme