GROUP BY, HAVING, ROLLUP/CUBE/GROUPING SETS
Oracle
-- Temel gruplama + HAVING
SELECT il, COUNT(*) AS n
FROM musteri
GROUP BY il
HAVING COUNT(*) > 5;
-- ROLLUP ile ara toplam ve genel toplam
SELECT il, ilce, SUM(bakiye)
FROM musteri
GROUP BY ROLLUP(il, ilce);GROUP BY satırları belirtilen sütunlara göre gruplayıp toplama fonksiyonu uygular; HAVING gruplanmış sonucu süzer (WHERE gruplamadan önce satırları süzer). ROLLUP hiyerarşik ara toplam + genel toplam, CUBE tüm kombinasyonları, GROUPING SETS ise seçilen grupları üretir. Oracle üçünü de destekler.
PostgreSQL
SELECT il, ilce, SUM(bakiye)
FROM musteri
GROUP BY GROUPING SETS ((il, ilce), (il), ());
-- CUBE tüm alt küme kombinasyonlarını üretir
SELECT il, ilce, SUM(bakiye)
FROM musteri
GROUP BY CUBE(il, ilce);PostgreSQL 9.5+ ROLLUP, CUBE ve GROUPING SETS'i standarda uygun destekler. GROUPING() fonksiyonu bir sütunun toplam satırında (NULL) olup olmadığını ayırt etmeye yarar. HAVING toplama sonrası, WHERE toplama öncesi süzme yapar.
MySQL
SELECT il, COUNT(*) AS n
FROM musteri
GROUP BY il
HAVING n > 5;
-- MySQL'de ROLLUP:
SELECT il, ilce, SUM(bakiye)
FROM musteri
GROUP BY il, ilce WITH ROLLUP;MySQL/MariaDB GROUP BY ... WITH ROLLUP söz dizimiyle ara/genel toplam üretir; CUBE ve GROUPING SETS'i desteklemez. HAVING ifadesinde SELECT'teki takma adlar kullanılabilir (bu Oracle/SQL Server'da genelde geçmez). ROLLUP satırlarında gruplanan sütun NULL görünür.
SQL Server
SELECT il, COUNT(*) AS n
FROM musteri
GROUP BY il
HAVING COUNT(*) > 5;
-- ROLLUP / CUBE / GROUPING SETS
SELECT il, ilce, SUM(bakiye)
FROM musteri
GROUP BY ROLLUP(il, ilce);SQL Server GROUP BY yanında ROLLUP(), CUBE() ve GROUPING SETS'i (2008+) modern söz dizimiyle destekler; eski WITH ROLLUP/WITH CUBE biçimi kullanımdan kalkmıştır. GROUPING() ve GROUPING_ID() toplam satırlarını ayırt etmede yardımcı olur.
MongoDB
// En yakın karşılık: $group + $sum
db.musteri.aggregate([
{ $group: { _id: "$il", n: { $sum: 1 } } },
{ $match: { n: { $gt: 5 } } }
])
// ROLLUP benzeri çok seviyeli toplam için $facet kullanılırMongoDB'de $group SQL GROUP BY karşılığıdır; _id gruplama anahtarını, akümülatörler ($sum, $avg, $max) toplamları belirler. Gruplama sonrası süzme $match ile yapılır (HAVING'e karşılık). ROLLUP/CUBE gibi çok düzeyli toplamlar $facet ile birden çok pipeline çalıştırılarak elde edilir.
Redis
# Uygulanamaz: çekirdek Redis'te GROUP BY yoktur.
# RediSearch ile toplama:
FT.AGGREGATE musteri_idx "*" GROUPBY 1 @il REDUCE COUNT 0 AS nÇekirdek Redis gruplama sunmaz; RediSearch modülünün FT.AGGREGATE komutu GROUPBY ve REDUCE (COUNT, SUM, AVG) ile SQL benzeri toplama yapar. FILTER aşaması HAVING gibi gruplanmış sonucu süzer. Modül yoksa toplama uygulamada yapılır.
Elasticsearch
GET musteri/_search
{
"size": 0,
"aggs": {
"il_bazinda": { "terms": { "field": "il" },
"aggs": { "toplam": { "sum": { "field": "bakiye" } } } }
}
}Elasticsearch'te gruplama 'terms' bucket agregasyonu, toplama ise metric agregasyonlarıyla (sum, avg, cardinality) yapılır. HAVING benzeri süzme için 'bucket_selector' pipeline agregasyonu kullanılır. Çok düzeyli ara toplam iç içe agregasyonlarla kurulur.