Kategoriler
ORACLE

Oracle Database 11g – SQL Temelleri I || Group Functions

5. Reporting Aggregated Data Using the Group Functions

GRUP FONKSİYONLARI KULLANMA

Grup fonksiyonları ile bir tablodan özet bir bilgi buluruz. Örneğin maaşlar kolonundan toplam maaşı, ortalama maaşı grup fonksiyonları yardımıyla buluruz.

Grup Fonksiyonlar Türleri

  • AVG             — ORTALAMA
  • COUNT       — DEĞER(SAYI)
  • MAX
  • MİN
  • STDDEV     — STANDART HATA
  • SUM            — TOPLAM
  • VARIANCE  — VARYANS

GRUP FONKSİYONLARI SYNTAX

SELECT group_function(column), ...
FROM table
[WHERE condition]
[ORDER BY column];
SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%PROG%';

-- job_id içerisinde 'PROG' ifadesi geçenler için istenilen 
-- grup fonksiyonlarını hesapladık.
-- tarih,karakter ifadeleri için de kullanabiliriz.
grup fonksiyonları
SELECT COUNT(*)
 FROM employees
 WHERE department_id = 50;

-- count (*) o tablodaki tüm satırların sayısını verir.
--COUNT(commission_pct) için satır adedini verir.
count
SELECT COUNT(DISTINCT department_id)
FROM employees;

 -- Tekrar etmeyen department_id sayısı

 COUNT DISTINCT

Group Functions and Null Values ( Grup Fonksiyonları ve Boş Değerler)

SELECT AVG(commission_pct)
FROM employees;
-- comm oranlarının ortalaması
-- null değerleri barındırdığı için hatalıdır
avg 
SELECT AVG(NVL(commission_pct, 0))
FROM employees;
--comm değeri null olmayanların ortalaması
-- doğru sonucu verir.
avg nvl

Grouping rows ( Satırları Gruplanması)

GROUP BY Clause

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

-- department_id ile salary ortalamasını gruplandırdık

group by clause

 

Çoklu Sütunlar için Gruplandırma:

SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id
ORDER BY SUM(salary)

-- iki kolona göre gruplandırıp sum(salary)'ye göre sıralıyoruz

Using the GROUP BY Clause on Multiple Columns

 

İzin Verilmeyen Grup Sorguları:

SELECT department_id, job_id, COUNT(last_name)
FROM employees
GROUP BY department_id;

-- Grup sayıları farklı olacağı için hata verecektir. 
-- Bunu engellemek için COUNT(JOB_ID) eklenmelidir.
hatalı grup sorguları
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;
hatalı grup sorguları

 

Bu sorunları HAVING Clause ile çözüme kavuşturacağız.

HAVING Clause ile Grup Sonuçlarını Koşullara göre Kısıtlama

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;

-- where clause gibi çalışır şarta göre gruplandırma yapar.
having clause
SELECT job_id, SUM(salary) Toplam Maaş
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);

-- job_id içinde 'rep' olmayan
-- sum salary 13000'den büyük olan
-- job_id ile salary kolonlarını gruplandır. 
-- salary göre sırala.
Having order clauses

Grup Fonksiyonlarını İç İçe Kullanma

SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;

-- fonksiyonların yeri önem taşımaktadır.
-- içte yer alan önce hesaplanır. daha sonra dışa doğru gidilir
-- önce ortalama maaşları bulduk. daha sonra max olanı yazdık.
(AVG(salary))
SELECT AVG(MAX(salary))
FROM employees
GROUP BY department_id;
-- önce max'ları bulup daha sonra ortalama hesaplamıştır
AVG(MAX(salary))

Derslerin devamı gelecektir. Eksik ve yanlış bulduğunuz noktalarda geri dönüş yaparsanız çok memnun kalırım.  Daha sonraki derste JOIN kullanımından bahsedilecektir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir