0Pricing
SQL Interview Prep · Ders

Bilinmeyen Sütunlarla Dinamik Döndürme

Kategoriler önceden bilinmediğinde döndürme sütunlarının oluşturulması.

Bilinmeyen Sütunlarla Dinamik Döndürme, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. 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.

Zor Çaprazlama Sorusu

CASE toplaması, SQL Server PIVOT veya PostgreSQL crosstab kullanan her statik çaprazlama aynı sınırlamayı paylaşır: sorguyu yazarken çıktı sütunlarını listelemelisiniz.

Peki kategoriler bilinmiyorsa ne olacak? Örneğin ürün adları her hafta değişebilir veya etkin olan her ay için bir sütun gerekebilir. Bu, dinamik çaprazlama olarak adlandırılır ve kıdemli düzeyde bir mülakat sorusudur; çünkü standart SQL, sütun listesi çalışma zamanında belirlenen bir sonuç döndüremez.

SQL Tek Başına Bunu Neden Yapamaz

SQL, sonuç kümesi düzeyinde statik olarak türlenmiştir: planlayıcı, çalıştırmadan önce sütunları ve bunların türlerini bilmelidir. Tek bir sorgu, bulduğunuz her değer için bir sütun oluştur diyemez.

Bu nedenle genel teknik, SQL metnini iki adımda oluşturmaktır: önce farklı kategorileri sorgulayın, ardından bunlardan bir çaprazlama sorgusu dizesi oluşturup bu dizeyi çalıştırın.

1. Adım: Kategorileri Toplama

İlk adım, sütunlara dönüşecek farklı değerleri listeleyen normal bir sorgudur. Sütun düzeninin kararlı olması için genellikle bu değerleri sıralarsınız.

Bu sonuç, dize oluşturma adımına girdi sağlar. Gerçek bir sistemde bu sorguyu çalıştırır, satırları alır ve sonraki sorguyu bunlardan oluşturursunuz.

SELECT DISTINCT quarter
FROM sales
ORDER BY quarter;
-- e.g. Q1, Q2, Q3, Q4

2. Adım: Sütun Listesini Oluşturma

Ardından bu değerleri, virgülle ayrılmış bir CASE ifadeleri listesine (veya PIVOT için köşeli parantez içine alınmış adlara) dönüştürün. Veritabanları bunu doğrudan SQL içinde yapmak için dize toplama işlevleri sağlar.

PostgreSQL'de bu işlev string_agg, MySQL'de GROUP_CONCAT, SQL Server'da ise STRING_AGG veya eski FOR XML PATH hilesidir.

-- Postgres: build the SELECT-list fragment
SELECT string_agg(
  format('SUM(CASE WHEN quarter = %L THEN amount END) AS %I',
         quarter, quarter),
  ', '
)
FROM (SELECT DISTINCT quarter FROM sales ORDER BY 1) q;

3. Adım: Birleştirme ve Çalıştırma

Oluşturulan parçayı tam bir sorgu dizesiyle birleştirin, ardından dinamik çalıştırma kullanarak çalıştırın: PL/pgSQL'de EXECUTE, SQL Server'da sp_executesql veya MySQL'de PREPARE/EXECUTE.

Bu, dinamik çaprazlamanın özüdür: SQL, SQL yazar ve ardından onu çalıştırır.

-- SQL Server pattern
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(quarter), ',')
FROM (SELECT DISTINCT quarter FROM sales) q;
SET @sql = N'SELECT region, ' + @cols + '
  FROM (SELECT region, quarter, amount FROM sales) s
  PIVOT (SUM(amount) FOR quarter IN (' + @cols + ')) p;';
EXEC sp_executesql @sql;

PostgreSQL Tam Örneği

PostgreSQL'de üç adımı bir DO bloğu veya işlev içinde birleştirirsiniz. Sütun listesini string_agg ile oluşturun, sorguya yerleştirin ve EXECUTE ile çalıştırın.

Sonuç sütunları çalışma zamanına kadar bilinmediğinden, bunu döndüren bir işlev genellikle RETURNS SETOF record kullanır veya satırları json olarak döndürür; çağıran taraf da bunları daha sonra genişletir.

DO $do$
DECLARE
  cols text;
  qry  text;
BEGIN
  SELECT string_agg(
    format('SUM(CASE WHEN quarter=%L THEN amount END) AS %I', quarter, quarter), ', ')
  INTO cols
  FROM (SELECT DISTINCT quarter FROM sales ORDER BY 1) q;
  qry := format('SELECT region, %s FROM sales GROUP BY region', cols);
  EXECUTE qry;
END $do$;

Hazırlanmış İfadelerle MySQL

MySQL'de bir çaprazlama işleci bulunmaz; bu nedenle dinamik çaprazlamalar GROUP_CONCAT ile koşullu toplama dizesi oluşturur ve ardından bunu hazırlanmış bir ifade aracılığıyla çalıştırır.

GROUP_CONCAT için bir uzunluk sınırı (group_concat_max_len) vardır. Görüşmeciler bundan söz edebilir; çok sayıda kategori varsa bu sınırı artırın.

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
  CONCAT('SUM(CASE WHEN quarter=''', quarter,
         ''' THEN amount END) AS ', QUOTE(quarter))
) INTO @sql FROM sales;
SET @sql = CONCAT('SELECT region, ', @sql,
                  ' FROM sales GROUP BY region');
PREPARE st FROM @sql; EXECUTE st; DEALLOCATE PREPARE st;

SQL Enjeksiyonu Riski

Veri değerlerini çalıştırılabilir SQL'e birleştirdiğiniz için dinamik çaprazlamalar enjeksiyon riski taşır. Bir kategori değeri tırnak işareti veya kötü amaçlı metin içerirse oluşturulan sorguyu bozabilir ya da ele geçirebilir.

Tanımlayıcıları ve sabitleri her zaman veritabanı motorunun güvenli yardımcılarıyla kaçışlayın: PostgreSQL'de format('%I', ...) ve %L, SQL Server'da QUOTENAME kullanın. Ham değerleri doğrudan dizeye yapıştırmayın.

-- Safe quoting prevents injection / breakage
-- Postgres: %I identifier, %L literal
format('SUM(CASE WHEN k=%L THEN v END) AS %I', cat, cat)
-- SQL Server: QUOTENAME(cat)

Bilinmeyen Sütunları Döndürme

İkinci zor kısım şudur: çağıran taraf sonuç biçimini önceden bilemez. Görüşmecilerin kabul ettiği yaygın yaklaşımlar şunlardır:

  • Satırları JSON olarak döndürün ve anahtarları uygulama katmanının genişletmesine izin verin.
  • Yordamın sorguyu yazdırmasını veya oluşturmasını sağlayın ve bu sorguyu ikinci bir adım olarak çalıştırın.
  • Kategoriler bilindikten sonra son çaprazlama işlemini uygulama kodunda (pandas, BI aracı) gerçekleştirin.

Tek bir statik çağrıdan rastgele sütunları döndürmenin temiz bir yolu yoktur.

Uygulamalı Örnek: Ürüne Göre Çaprazlama

Ürünlerin zaman içinde değiştiğini ve raporun sales tablosunda şu anda bulunan her ürün için bir gelir sütununa ihtiyaç duyduğunu varsayalım. Listeyi kod içine sabitleyemezsiniz; bu nedenle listeyi oluşturmanız gerekir. PostgreSQL bunu okunaklı biçimde yapar: string_agg ve güvenli tırnaklama ile CASE parçasını oluşturun, bunu bir sorguya yerleştirin ve ardından EXECUTE ile çalıştırın.

Adımları görüşmeciye açıklayın: ürünleri bulun, her birini tırnak içine alınmış bir sütuna dönüştürün, birleştirin ve çalıştırın. Aynı yaklaşım her veritabanı motoru için geçerlidir; yalnızca yardımcılar değişir.

DO $do$
DECLARE cols text; qry text;
BEGIN
  SELECT string_agg(
    format('SUM(CASE WHEN product=%L THEN amount END) AS %I',
           product, product), ', ')
  INTO cols
  FROM (SELECT DISTINCT product FROM sales ORDER BY 1) p;
  qry := format('SELECT region, %s FROM sales GROUP BY region', cols);
  EXECUTE qry;
END $do$;

Dinamik Çaprazlamalardan Ne Zaman Kaçınmalı

Başarılı adaylar bunu SQL içinde ne zaman yapmamaları gerektiğini bilir. Dinamik SQL'i okumak, sınamak, güvenli hale getirmek ve önbelleğe almak daha zordur. Çoğu zaman daha iyi yanıt şudur:

  • SQL'den uzun biçimi döndürün ve çaprazlama işlemini uygulama veya raporlama katmanında yapın.
  • Kategori kümesi küçük ve yavaş değişiyorsa statik bir çaprazlama kullanın ve bunu ara sıra güncelleyin.

Dinamik çaprazlamaları gerçekten ucu açık ve sürekli değişen kategori kümeleri için saklayın.

Hızlı Kontrol

Dinamik çaprazlamaların var olmasının temel nedenini sınayın.

Özet

Dinamik çaprazlamalar bilinmeyen sütun kümelerini ele alır:

  • Statik çaprazlamalar başarısız olur; çünkü sonuç sütunları çalıştırmadan önce sabitlenmelidir.
  • Desen şöyledir: farklı kategorileri sorgulayın, bir çaprazlama SQL dizesi oluşturun ve bunu dinamik olarak çalıştırın.
  • Sütun listesini oluşturmak için string_agg/GROUP_CONCAT/STRING_AGG kullanın.
  • SQL enjeksiyonunu önlemek için değerleri (%I/%L, QUOTENAME) kaçışlayın.
  • Çoğu zaman uzun biçimi döndürmek ve çaprazlama işlemini uygulama katmanında yapmak daha temizdir.

Sıkça Sorulan Sorular

“Bilinmeyen Sütunlarla Dinamik Döndürme” dersi ücretsiz mi?

Evet — “Bilinmeyen Sütunlarla Dinamik Döndürme” 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.

“Bilinmeyen Sütunlarla Dinamik Döndürme” dersinde ne öğreneceğim?

Kategoriler önceden bilinmediğinde döndürme sütunlarının oluşturulması. 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 4. dersidir.

“Bilinmeyen Sütunlarla Dinamik Döndürme” 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

  1. Koşullu Toplama ile Döndürme
  2. Üreticiye Özgü PIVOT ve Çapraz Tablo Sözdizimi
  3. Sütunları Satırlara Dönüştürme
  4. Bilinmeyen Sütunlarla Dinamik Döndürme
← SQL Interview Prep Sayfasına Dön