Tek Bir GROUP BY'ın Ötesi
Birden çok düzeyde toplama yapın.
Tek Bir GROUP BY'ın Ötesi, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 1. 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 Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.
Tek GROUP BY Kullanmanın Sınırlılığı
Standart bir GROUP BY yan tümcesi, satırları tek bir belirli düzeyde toplulaştırmanıza olanak tanır — örneğin bölge başına toplam satış. Peki aynı sorguda ürün kategorisi başına toplamları ve genel toplamı da istiyorsanız ne yapmalısınız?
Sorguyu üç kez tekrarlamak ve UNION ALL kullanmak işe yarar, ancak ayrıntılı ve yavaştır. SQL, bu sorunu tek geçişte zarifçe çözen üç güçlü genişletme sunar — GROUPING SETS, ROLLUP ve CUBE.
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;Örnek Tabloyu Hazırlama
Bu ders boyunca her satışı bölge, kategori ve tutar bilgileriyle kaydeden basit bir sales tablosu kullanacağız. Yaklaşan her sorgunun bağlam içinde anlamlı olması için bu tabloyu oluşturup verilerle doldurun.
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales (region, category, amount) VALUES
('North', 'Electronics', 1200),
('North', 'Clothing', 800),
('South', 'Electronics', 950),
('South', 'Clothing', 600),
('East', 'Electronics', 1100),
('East', 'Clothing', 750);GROUPING SETS Nedir?
GROUPING SETS, tek bir GROUP BY cümlesi içinde birden çok bağımsız gruplama düzeyi tanımlamanızı sağlar. Listedeki her küme, ayrı sorgular yazıp bunları UNION ALL ile birleştirmişsiniz gibi kendi satır grubunu üretir.
Sözdizimi şöyledir: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). Boş küme (), tüm satırlar arasındaki genel toplamı temsil eder.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);GROUPING SETS Çıktısını Okuma
GROUPING SETS sorgusunu çalıştırdığınızda, farklı gruplama düzeylerine ait satırlar birlikte alt alta sıralanır. Belirli bir kümeye dahil olmayan sütunlar, o satırda NULL olarak görünür.
Örneğin, (region) kümesine ait bir satırın category sütununda NULL bulunur. Bu, toplamın o bölgedeki tüm kategorileri kapsadığını belirtir. Genel toplam satırında (boş küme) hem region hem de category sütunlarında NULL bulunur.
SELECT
COALESCE(region, 'ALL REGIONS') AS region,
COALESCE(category, 'ALL CATEGORIES') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY region NULLS LAST, category NULLS LAST;ROLLUP ile Tanışma
ROLLUP, yaygın bir gruplama kümeleri hiyerarşisi için kullanılan bir kısayoldur. (A, B) sütunları verildiğinde ROLLUP(A, B) şu kümeleri otomatik olarak oluşturur: (A, B), (A) ve ().
Bu yapı; yıldan aya, aydan güne veya bölgeden kategoriye uzanan hiyerarşik veriler için idealdir. Oluşturulan küme sayısı, listelenen sütun sayısı n olmak üzere her zaman n + 1'dir.
-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Üç Düzeyli ROLLUP
ROLLUP içine üçüncü bir sütun eklemek, hiyerarşiyi bir düzey daha genişletir. ROLLUP(A, B, C) dört küme oluşturur: (A, B, C), (A, B), (A) ve ().
Aşağıdaki örnekte year en dıştaki düzey, category ise en ayrıntılı düzeydir. Sorgu, hiyerarşinin her adımında ara toplamlar ve ayrıca bir genel toplam satırı üretir.
SELECT
year,
region,
category,
SUM(amount) AS total
FROM (
VALUES
(2024, 'North', 'Electronics', 1200),
(2024, 'North', 'Clothing', 800),
(2024, 'South', 'Electronics', 950),
(2025, 'North', 'Electronics', 1400),
(2025, 'South', 'Clothing', 700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;CUBE ile Tanışma
CUBE, ROLLUP'tan da daha kapsamlıdır. n sütun verildiğinde, genel toplam da dahil olmak üzere gruplama kümelerinin tüm 2^n olası kombinasyonlarını üretir.
CUBE(region, category) için oluşturulan kümeler şunlardır: (region, category), (region), (category) ve () — toplam dört küme. Bu yapı, yalnızca tek bir hiyerarşi boyunca değil, her yönde çapraz kesit toplamlarına ihtiyaç duyduğunuzda kullanışlıdır.
-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;CUBE ve ROLLUP — Hangisini Ne Zaman Kullanmalı?
Seçiminizi boyutlarınızın doğal bir hiyerarşiye sahip olup olmamasına göre yapın:
- Sütunlar hiyerarşik olduğunda (örneğin ülkeden şehre, şehirden mağazaya) ROLLUP kullanın. Ara toplamlar yalnızca tek bir yol boyunca üst düzeylere taşınır.
- Sütunlar bağımsız boyutlar olduğunda (örneğin bölge ve kategori) ve olası her çapraz kesiti istediğinizde CUBE kullanın.
- Tam denetime ihtiyaç duyduğunuzda ve ne ROLLUP ne de CUBE gereksinimlerinizi tam olarak karşılamadığında GROUPING SETS kullanın.
GROUPING() İşlevi
NULL hem gerçek bir eksik değer hem de gruplama yer tutucusu anlamına gelebileceğinden SQL, GROUPING() işlevini sunar. Sütun bir üst toplulaştırma (yer tutucu) satırının parçası olduğunda 1, sütun gerçekten gruplamada kullanıldığında ise 0 döndürür.
Bu sayede gerçek bir NULL bölgesini, tüm bölgeleri kapsayan bir ara toplam satırından ayırt edebilirsiniz.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_subtotal,
GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Satırları Etiketlemek için GROUPING() Kullanma
Yaygın bir yaklaşım, ham NULL değerleri yerine insanların kolayca okuyabileceği etiketler üretmek için GROUPING() işlevini bir CASE ifadesiyle birlikte kullanmaktır. Bu, bir ROLLUP veya CUBE sorgusunun çıktısını raporlarda okumayı çok kolaylaştırır.
SELECT
CASE GROUPING(region)
WHEN 1 THEN 'Grand Total'
ELSE region
END AS region_label,
CASE GROUPING(category)
WHEN 1 THEN 'All Categories'
ELSE category
END AS category_label,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;Sabit Sütunları ROLLUP ile Birlikte Kullanma
Aynı cümlede normal GROUP BY sütunlarını ROLLUP(...) veya CUBE ile birlikte kullanabilirsiniz. ROLLUP(...) dışında listelenen sütunlar her gruplama kümesine dahil edilir; hiçbir zaman üst düzeye taşınmaz.
Aşağıdaki sorguda year sabit bir gruplama sütunuyken region ve category rollup işlemine katılır. Böylece tüm yıllar üzerinden değil, yıl başına ara toplamlar elde edersiniz.
SELECT
2024 AS year,
region,
category,
SUM(amount) AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Hızlı Kontrol
GROUPING SETS, ROLLUP ve CUBE konusundaki anlayışınızı sınayın.
Özet — Tek Bir GROUP BY'ın Ötesi
Bu derste, tek bir sorguda birden çok toplulaştırma düzeyi üretmenizi sağlayan üç güçlü SQL uzantısını öğrendiniz:
- GROUPING SETS — tam elle denetim sağlar; ihtiyacınız olan kombinasyonları tam olarak listelersiniz.
- ROLLUP — hiyerarşiler için idealdir; en ayrıntılı düzeyden genel toplama kadar üst düzeylere çıkar.
- CUBE — listelenen boyutların olası her çapraz kesitini oluşturur.
Ayrıca GROUPING() işlevinin gerçek NULL değerlerini üst toplulaştırma yer tutucusu olan satırlardan ayırdığını ve CASE GROUPING(...) kalıplarının temiz, okunabilir rapor çıktıları ürettiğini öğrendiniz.
Bu araçlar çok boyutlu özetlere ihtiyaç duyduğunuz her durumda vazgeçilmezdir; çapraz tablo tarzı raporlar, panolar ve veri ambarı sorguları bunlara büyük ölçüde dayanır.
Sıkça Sorulan Sorular
“Tek Bir GROUP BY'ın Ötesi” dersi ücretsiz mi?
Evet — “Tek Bir GROUP BY'ın Ötesi” 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 Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.
“Tek Bir GROUP BY'ın Ötesi” dersinde ne öğreneceğim?
Birden çok düzeyde toplama yapın. SQL Academy 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 Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Academy, 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 1. dersidir.
“Tek Bir GROUP BY'ın Ötesi” 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 Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Academy 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
- Tek Bir GROUP BY'ın Ötesi
- Ara Toplamlar için ROLLUP
- Tüm Birleşimler için CUBE
- GROUPING SETS Açıklaması