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
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".
-- 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:
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:
- gruplandırma sütunlarından biri (ör.
department_id,d.name) veya - bir toplama işlevi içinde (ör.
AVG(salary),COUNT(*)).
-- 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
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.
İ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
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.
İ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