Ana içeriğe geç
Modül 3 · Ders 3 ders 4Kurstaki 11/57~10 min
Modül dersleri (3/4)

GROUP BY ile gruplama

Modül 2'de COUNT(*), AVG(...), SUM(...)'nin hepsini azalttığını öğrendiniz satırları tek sonuç satırına dönüştürün. Peki ya ortalama bir maaş* istiyorsanız her departman için, tüm şirket için değil mi? Bir satır _per istiyorsun grup*. Bu GROUP BY'in işi.

Sözdizimi

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column;

İngilizce Oku: "satırları aynı değeri paylaşan gruplara ayırın grouping_column ve her grup için toplamı hesaplayın".

SQL
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM   employees
GROUP BY department_id;

Sonuçta bulunan her farklı department_id için bir satır bulunur. employees. 5 satır alacaksınız: 4 departmanın her biri için bir tane (1, 2, 3, 4) artı NULL (Andrea Costa) için bir tane.

Okunabilir adlar için JOIN ile

Çoğu zaman department_id'ye göre gruplamak, ancak dosyanın adını göstermek istersiniz. departman. GROUP BY ile JOIN'ü birleştiriyorsunuz:

SQL
SELECT d.name AS department,
       COUNT(*)    AS count,
       AVG(e.salary) AS average_salary
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;

Bu tam teşekküllü bir iş zekası sorgusudur: üç satırda size her departmanın kaç çalışanı olduğunu ve bu çalışanlardan ne kadar kazandıklarını söyler ortalama, büyükten küçüğe doğru sıralanmıştır.

Altın kural

GROUP BY kullandığınızda, SELECT içindeki her sütun şöyle olmalıdır:

  1. gruplandırma sütunlarından biri (ör. department_id, d.name) veya
  2. bir toplama işlevi içinde (ör. AVG(salary), COUNT(*)).
SQL
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM   employees
GROUP BY department_id;

PostgreSQL açık bir hata döndürüyor ("sütununun GROUP BY'de görünmesi gerekir) yan tümcesinde veya bir toplama işlevinde kullanılabilir"). Bu, haftaların başında yaygın bir durum hata: eğer onu görürseniz, durun ve kendinize şunu sorun: "bunun değeri nedir?" first_name 3 kişilik bir grup için?"_ — tek bir cevap yok ve bu yüzden motor reddediyor.

Deneyin

Egzersiz#sql.m3.l3.e1
Denemeler: 0Yükleniyor…

Her departman için kaç çalışan bulunduğunu hesaplayın. İki sütun döndürün: departman adı (departmanlar.adı) ve çalışan sayısı. Bölüm başına bir satır.

Düzenleyici yükleniyor…
İpucu göster

COUNT(*) ile toplayın ve d.name'e göre gruplayın. SELECT yalnızca gruplandırma sütununu ve toplamı içermelidir.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m3.l3.e2
Denemeler: 0Yükleniyor…

Her departman (departments.name) için, çalışanlarının ortalama maaşını (AVG(maaş)) en yüksekten en düşüğe doğru sıralayarak hesaplayın.

Düzenleyici yükleniyor…
İpucu göster

Toplam olarak AVG(e.maaş), d.adına göre GRUP, ortalamaya GÖRE SİPARİŞ TANIM.

3 denemeden sonra çözüm mevcut