Aggregate functions
Download
1 / 20

AGGREGATE FUNCTIONS - PowerPoint PPT Presentation


  • 232 Views
  • Updated On :

AGGREGATE FUNCTIONS. Prof. Sin-Min Lee Surya Bhagvat CS 157A – Fall 2005. Aggregate Functions. What is an aggregate function?

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'AGGREGATE FUNCTIONS' - bernad


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Aggregate functions l.jpg

AGGREGATE FUNCTIONS

Prof. Sin-Min Lee

Surya Bhagvat

CS 157A – Fall 2005


Aggregate functions2 l.jpg
Aggregate Functions

  • What is an aggregate function?

    An aggregate function summarizes the results of an expression over a number of rows, returning a single value. The general syntax for most of the aggregate functions is as follows: aggregate_function ([DISTINCT|ALL] expression)


Commonly used aggregate functions l.jpg
Commonly used Aggregate functions

  • Some of the commonly used aggregate functions

  • are :

  • SUM

  • COUNT

  • AVG

  • MIN

  • MAX


Examples l.jpg
Examples

Consider the following Employee table:

EMPLOYEE ( EMP_ID, NAME, DEPT_NAME, SALARY)

CREATE TABLE EMPLOYEE

(

EMP_ID NUMBER,

NAME VARCHAR2(50),

DEPT_NAME VARCHAR2(50),

SALARY NUMBER

);


Employee table contd l.jpg
Employee Table (Contd….)

Run the following script to insert the records in the table

INSERT INTO EMPLOYEE VALUES (100,'ABC','ENG',50000);

INSERT INTO EMPLOYEE VALUES (101,'DEF','ENG',60000);

INSERT INTO EMPLOYEE VALUES (102,'GHI','PS',50000);

INSERT INTO EMPLOYEE VALUES (103,'JKL','PS',70000);

INSERT INTO EMPLOYEE VALUES (104,'MNO','SALES',75000);

INSERT INTO EMPLOYEE VALUES (105,'PQR','MKTG',70000);

INSERT INTO EMPLOYEE VALUES (106,‘STU','SALES',null);

COMMIT;


Select on employee table l.jpg
Select on Employee Table

After the insert when we query the Employee table we get the

following results:

Select * from Employee;


Performing sum l.jpg
Performing SUM

Query 1: To find the sum of all salaries in the organization:

SELECT SUM(SALARY) FROM EMPLOYEE;

375000

Query 2: To find the sum of the salaries grouped by dept

SELECT SUM(SALARY) FROM EMPLOYEE GROUP BY

DEPT_NAME


Sum continued l.jpg
SUM (Continued)

If we take a look at the previous query the information won’t

tell us what’s the sum for a particular department. So to include that

information we add DEPT_NAME in the SELECT

SELECT DEPT_NAME,SUM(SALARY) FROM EMPLOYEE

GROUP BY DEPT_NAME;


Sum continued9 l.jpg
SUM (Continued…..)

The query in the previous slide lists the information for all the

departments. What if we want the information to be restricted only

for a particular department like Engg

Is this query correct?

SELECT DEPT_NAME,SUM(SALARY) FROM EMPLOYEE

GROUP BY

DEPT_NAME

WHERE DEPT_NAME = 'ENG';


Sum continued10 l.jpg
SUM (Continued….)

No, the query would result in the sql error (in Oracle)

ORA-00933: SQL Command not properly ended

Remember : If we use the aggregate functions then you cannot use

the WHERE clause. In order to get the result what we need to use is

the HAVING clause. So the query would be

SELECT DEPT_NAME,SUM(SALARY) FROM EMPLOYEE

GROUP BY

DEPT_NAME

HAVING DEPT_NAME = 'ENG';


Avg function l.jpg
AVG Function

Query 1: If we want to calculate the AVG of all the salaries in

the organization the SQL would be

SELECT AVG(SALARY) FROM EMPLOYEE

62,500

Is this what we expect????

Employee table has 7 records and the salaries are

50,000+60,000+50,000+70,000+75,000+70,000+null/7 = 53571

But we obtained 62500 from the query? Why is this so????


Avg continued l.jpg
AVG (Continued….)

Remember : COUNT(*) is the only function which won’t ignore

Nulls. Other functions like SUM,AVG,MIN,MAX they ignore

Nulls. What it means is in the previous query the salary value for

a particular employee was NULL. So the query

SELECT AVG(SALARY) FROM EMPLOYEE

would ignore nulls and the way the average is calculated then would

be

50,000+60,000+50,000+70,000+75,000+70,000/6 = 62500


Avg continued13 l.jpg
AVG (Continued….)

From the information given in the previous slide what do you think

would be the output of the following query

Select COUNT(*),COUNT(SALARY) FROM EMPLOYEE;

It would be

COUNT(*) COUNT(SALARY)

7 6

Because COUNT(*) is not going to ignore the Nulls in the result

whereas COUNT(SALARY) is going to ignore the Nulls.


Avg continued14 l.jpg
AVG (Continued…..)

SELECT student_name,avg(mark) FROM student,enrolment

WHERE student.student_id=enrolment.student_id;

Which one of the following is correct for the query?

(a) The query is not legal

(b) The query retrieves for each student enrolled,his/her name and their

average mark

(c) The query retrieves for each student enrolled,his/her name and the class

average mark

(d) The query retrieves for each student enrolled,his/her name and the

mark in each subject

Is the answer (a) or (b)??????


Avg continued15 l.jpg
AVG (Continued….)

If option 1 is not given then the correct answer would be option 2.

//Script begin

Drop table student;

Drop table enrolment;

create table Student

(student_name varchar2(100),

student_id varchar2(50)

);

create table enrolment

(student_id varchar2(50),

mark number);


Avg continued16 l.jpg
AVG (Continued….)

//Script Continued

insert into student values ('A','1');

insert into student values ('B','2');

insert into student values ('C','3');

insert into enrolment values ('1',10);

insert into enrolment values ('1',20);

insert into enrolment values ('1',30);

insert into enrolment values ('2',40);

insert into enrolment values ('2',50);

insert into enrolment values ('2',60);

insert into enrolment values ('3',70);

insert into enrolment values ('3',60);

insert into enrolment values ('3',50);

commit;


Avg continued17 l.jpg
AVG (Continued….)

If we try to execute the query given in the question

SELECT student_name,avg(mark) FROM student,enrolment

WHERE student.student_id=enrolment.student_id;

We would get the following error in Oracle

ORA-00937:not a single-group group function

Why is it so????


Avg continued18 l.jpg
AVG (Continued….)

Remember : When we use any of the aggregate functions in SQL

all the columns listed in the SELECT need to be part of the

GROUP BY Clause. In the previous SQL

SELECT student_name,avg(mark) FROM student,enrolment

WHERE student.student_id=enrolment.student_id;

student_name, avg(mark) are the columns included in the select.

avg is the aggregate function. So if we leave that one out then

the column which needs to part of the group by clause would be

student_name.


Avg final sql l.jpg
AVG (Final SQL)

The final SQL then would be

SELECT student_name,avg(mark)

FROM student,enrolment

WHERE student.student_id=enrolment.student_id

group by student_name;

Which would give out the desired output


Using min and max l.jpg
Using MIN AND MAX

Query 1: To find the minimum salary within a particular department

SELECT MIN(SALARY),NAME FROM EMPLOYEE

GROUP BY NAME;

Query 2: To find the maximum salary within a particular department

SELECT MAX(SALARY),NAME FROM EMPLOYEE

GROUP BY NAME;