You are on page 1of 45

SQL OLAP

ON LINE ANALYTICAL PROCESSING


THINK: BUILDING AND DELIVERING INFORMATION VIA SQL
SQL OLAP FUNCTIONS

• RANK : MEMBERI RANKING PADA SETIAP BARIS BERDASARKAN URUTAN TERTENTU


• DENSE_RANK: MEMBERI RANKING PADA PARTISI TERTENTU (DENSE: RINGKAS,
PADAT)
• ROW_NUMBER: MEMBERI NOMOR BARIS BERDASARKAN SATU ATAU LEBIH KOLOM
• ROLLUP
• CUBE
• GROUPING SETS
• GROUPING
DATABASE FUNDAMENTALS > SQL >
LANGUAGE ELEMENTS > EXPRESSIONS >
OLAP SPECIFICATION
• ON-LINE ANALYTICAL PROCESSING (OLAP) FUNCTIONS PROVIDE THE ABILITY
TO:
• RETURN RANKING {RANK, DENSE_RANK}
• ROW NUMBERING {ROW_NUMBER}
• EXISTING AGGREGATE FUNCTION INFORMATION

AS A SCALAR VALUE IN A QUERY RESULT.


TABEL EMPLOYEE
RANK()
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE WHERE SALARY+BONUS > 50000
ORDER BY LASTNAME;

PRIORITAS PERTAMA DIURUTKAN BY LASTNAME


DEFAULT PENGURUTAN ADALAH ASCENDING.
DESC  BOTTOM UP  DARI Z KE A, DARI BESAR KE KECIL
ASC  TOP-DOWN  DARI A KE Z, DARI KECIL KE BESAR
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE WHERE SALARY+BONUS > 50000;

PRIORITAS PERTAMA DIURUTKAN BERDASARKAN RANK_SALARY


DESC  DARI BESAR KE KECIL.
ELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE WHERE SALARY+BONUS > 50000
ORDER BY SALARY+BONUS DESC;
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS
TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS
RANK_SALARY
FROM EMPLOYEE WHERE SALARY+BONUS > 50000
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE JOIN DEPARTEMENT ON EMPLOYEE. WORKDEPT = DEPARTEMENT.DEPTNO
WHERE SALARY+BONUS > 50000
ORDER BY RANK_SALARY;

SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,


RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE WHERE SALARY+BONUS > 50000
ORDER BY RANK() OVER (ORDER BY SALARY+BONUS DESC) ;
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY LASTNAME) AS RANK_LASTNAME
FROM EMPLOYEE WHERE SALARY+BONUS > 50000
ORDER BY RANK_LASTNAME;

 BY DEFAULT ASCENDING (ASC: DARI A KE Z)


PRIORITAS PERTAMA DIURUTKAN BERDASARKAN LASTNAME MENGGUNAKAN
FUNGSI RANK().
Query untuk mencari rangking dari rata-rata total_salary (salary ditambah bonus) per departemen.
Tampilkan kolom workdept, rata-rata total_salary, dan rankingnya.

SELECT WORKDEPT, AVG(SALARY+BONUS) AS AVG_TOTAL_SALARY,


RANK() OVER (ORDER BY AVG(SALARY+BONUS) DESC) AS RANK_AVG_SAL
FROM EMPLOYEE
GROUP BY WORKDEPT
ORDER BY RANK_AVG_SAL;
DENSE_RANK

MEMBERI RANKING SECARA PARSIAL .


MEMBERI RANKING PADA KELOMPOK DATA TERTENTU.
Beri ranking pada setiap kelompok departement (WORKDEPT) berdasarkan EDLEVEL tertinggi.
Urutkan berdasarkan WORKDEPT.

SELECT EMPNO, LASTNAME, WORKDEPT, EDLEVEL,


DENSE_RANK() OVER (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS
RANK_EDLEVEL
FROM EMPLOYEE
ORDER BY WORKDEPT;
Beri ranking pada setiap kelompok departement (WORKDEPT) berdasarkan EDLEVEL tertinggi.
Urutkan berdasarkan LASTNAME.

SELECT EMPNO, LASTNAME, WORKDEPT, EDLEVEL,


DENSE_RANK() OVER (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS
RANK_EDLEVEL
FROM EMPLOYEE
ORDER BY LASTNAME;
Beri ranking pada setiap kelompok departement (WORKDEPT) berdasarkan EDLEVEL tertinggi.
Urutkan berdasarkan WORKDEPT dan LASTNAME.

SELECT EMPNO, LASTNAME, WORKDEPT, EDLEVEL,


DENSE_RANK() OVER (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS
RANK_EDLEVEL
FROM EMPLOYEE
ORDER BY WORKDEPT, LASTNAME;
CONTOH:
Mencari 5 ranking total salary (salary+bonus) tertinggi.

SELECT EMPNO, LASTNAME, FIRSTNME, TOTAL_SALARY, RANK_SALARY


FROM
(SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS
TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE) AS RANKED_EMPLOYEE
WHERE RANK_SALARY < 6
ORDER BY RANK_SALARY;
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE
WHERE (SALARY + BONUS) > 90000;

SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY, "TOTAL_SALARY


RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY " is not valid in the
FROM EMPLOYEE context where it is
used..
WHERE TOTAL_SALARY > 90000; SQLCODE=-206,
SQLSTATE=42703,
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY, DRIVER=4.18.60
RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
FROM EMPLOYEE
WHERE RANK_SALARY > 6;
LEAD()
FIRST_VALUE()
SELECT EMPNO, WORKDEPT, JOB, SALARY,
LEAD(SALARY, 0) OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS L_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY;

SELECT EMPNO, WORKDEPT, JOB, SALARY,


LEAD(SALARY, 1) OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS L_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY;

SELECT EMPNO, WORKDEPT, JOB, SALARY,


LEAD(SALARY, 2) OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS L_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY;
LEAD(SALARY, 0)

LEAD(SALARY, 1)
SELECT EMPNO, WORKDEPT, LASTNAME, FIRSTNME, JOB, SALARY,
LEAD(SALARY, 1) OVER
(PARTITION BY WORKDEPT ORDER BY SALARY) - SALARY AS
DELTA_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY;
SELECT EMPNO, WORKDEPT, JOB, SALARY,
FIRST_VALUE(SALARY) OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS
L_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY;
SELECT JOB, HIREDATE, EMPNO, LASTNAME, FIRSTNME, SALARY,
FIRST_VALUE(SALARY) OVER (PARTITION BY JOB ORDER BY HIREDATE) AS
FIRST_SALARY,
SALARY - FIRST_VALUE(SALARY) OVER (PARTITION BY JOB ORDER BY HIREDATE) AS
DELTA_SALARY
FROM EMPLOYEE
ORDER BY JOB, HIREDATE;
ROW_NUMBER
Memberi nomor pada setiap baris berdasarkan urutan ascending WORKDEPT dan LASTNAME.

SELECT ROW_NUMBER() OVER (ORDER BY WORKDEPT, LASTNAME) AS NUMBER,


LASTNAME, WORKDEPT, SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, LASTNAME;
ROLLUP()
CUBE()
• WILL RESULT IN THE DATA BEING SUMMARIZED AT THE CERTAIN LEVELS.
CONTOH ROLLUP
Menjumlahkan Penjualan Pada Tabel Trans
Berdasarkan Country Dan Region
CONTOH CUBE
Menjumlahkan Penjualan Pada Tabel Trans
Berdasarkan Country Dan Region
WHAT’S THE DIFFERENT ?

SELECT WORKDEPT, JOB, SUM(SALARY) SELECT WORKDEPT, JOB, SUM(SALARY)

FROM EMPLOYEE FROM EMPLOYEE

GROUP BY ROLLUP (WORKDEPT,JOB) GROUP BY CUBE (WORKDEPT,JOB)

ORDER BY WORKDEPT; ORDER BY WORKDEPT;

SELECT WORKDEPT, JOB, SUM(SALARY) SELECT WORKDEPT, JOB, SUM(SALARY)

FROM EMPLOYEE FROM EMPLOYEE

GROUP BY (WORKDEPT,JOB) GROUP BY GROUPING SETS (WORKDEPT, JOB)

ORDER BY WORKDEPT; ORDER BY WORKDEPT;


WHAT’S THE DIFFERENT ?

SELECT WORKDEPT, JOB, SUM(SALARY)


FROM EMPLOYEE
GROUP BY ROLLUP(WORKDEPT,JOB)
ORDER BY WORKDEPT;
WHAT’S THE DIFFERENT ?

SELECT WORKDEPT, JOB, SUM(SALARY)


FROM EMPLOYEE
GROUP BY (WORKDEPT, JOB)
ORDER BY WORKDEPT;
WHAT’S THE DIFFERENT ?

SELECT WORKDEPT, JOB, SUM(SALARY)


FROM EMPLOYEE
GROUP BY CUBE(WORKDEPT, JOB)
ORDER BY WORKDEPT;
WHAT’S THE DIFFERENT ?

SELECT WORKDEPT, JOB, SUM(SALARY)


FROM EMPLOYEE
GROUP BY GROUPING SETS(WORKDEPT, JOB)
ORDER BY WORKDEPT;
GROUPING SETS
GROUPING SETS()
MULTIPLICATIVE VS. ADDITIVE

• MULTIPLICATIVE : Perkalian
• ADDITIVE : Penjumlahan
GROUPING SET INDEX

• PADA TABEL FAKTA DAPAT DIBERI INDEX UNTUK MENGOPTIMALKAN EKSEKUSI


QUERY OLAP GROUPING SET.
CONTOH PERBEDAAN ROLLUP DAN CUBE
• SELECT * FROM SALES; --41 RECORD

• SELECT REGION, SALES_DATE, SUM(SALES) AS HASIL_PENJUALAN


• FROM SALES
• GROUP BY REGION, SALES_DATE;

• SELECT REGION, SALES_DATE, SUM(SALES) AS HASIL_PENJUALAN


• FROM SALES
• GROUP BY ROLLUP(REGION,SALES_DATE);

• SELECT REGION, SALES_DATE, SUM(SALES) AS HASIL_PENJUALAN


• FROM SALES
• GROUP BY ROLLUP(SALES_DATE,REGION);

• SELECT REGION, SALES_DATE, SUM(SALES) AS HASIL_PENJUALAN


• FROM SALES
• GROUP BY CUBE(REGION,SALES_DATE);
TERIMAKASIH

You might also like