CS 3630 Database Design and Implementation
Project Phase II Assignment 8 Due Monday, April 10, by 5 PM
Aggregate Functions Produce a single value from a set Examples: Max, Min, Sum, Avg, Count
Aggregate functions Count Max Min Sum Avg …
SQL Aggregate Functions // Max, Min, Avg, Sum Select Max(price), Min(price), Avg(price) From room; Select Max(room_no), Min(room_no) Select Avg(room_no), Sum(room_no) // No! // Room_No char(4)
Max/Min Dates Select Min(Date_From), Max(Date_To) From Booking; Col Min(Date_From) Format a20 Heading 'Earlist Date_From' Col Max(Date_To) Format a20 Heading 'Latest Date_To' Select To_Char(Min(Date_From), 'Mon dd yyyy'), To_Char(Max(Date_To), 'Mon dd yyyy')
Max/Min Dates col "Earliest Date from" format a20 col "Latest Date To" format a20 Select To_Char(Min(Date_From), 'Mon dd yyyy') "Earliest Date from", To_Char(Max(Date_To), 'Mon dd yyyy') "Latest Date To" From Booking; -- Incorrect! Select Min(To_Char(Date_From, 'Mon dd yyyy')), Max(To_Char(Date_To, 'Mon dd yyyy'))
Aggregate Functions -- Count(*): number of all records -- count(hotel_no): number of Hotel_No -- Count(unique Hotel_No): -- number of distinct Hotel_No Select count(*), count(hotel_no), count(unique hotel_no) From room; -- Does not count null values select count(*), count(address) From guest;
Aggregate Functions Select Avg(Price) From room; -- With Distinct Select Avg(Distinct Price)
Aggregate Functions with Where -- With where clause -- Avg is applied after Where clause Select Avg(Price) From room Where rtype = 'Family'; Where rtype = 'Single' Where rtype = 'Double'
Aggregate Functions with Where -- With where clause -- Avg is applied after Where clause Select 'Average Price of Family rooms: ', Avg(Price) From room Where rtype = 'Family‘; Select rtype, Avg(Price) Where rtype = 'Family'; -- change rtype to Single, Double
One record for each group. Group By Clause Count, Avg Select Group By Count, Avg Count, Avg One record for each group.
Group By Select Avg(Price) From room Group by rtype; Select rtype, Avg(Price)
Group By Clause For each hotel, display Hotel_No with the number of rooms. Select Hotel_No, Count(*) From Room Group By Hotel_No; Hotel_No Room_No Price H01 R001 30 R002 35 H05 R003 40 R103 45 R101 50 Hotel_No Room_No Price H01 R001 30 R002 35 R103 45 H05 R003 40 R101 50 Hotel_No Count H01 3 H05 2
What can be selected with Group By Clause Can select Hotel_No, the group by field Can select aggregate functions on any other fields such as Max(Room_No) or Avg(Price) Hotel_No Room_No Price H01 R001 30 R002 35 R103 45 H05 R003 40 R101 50 Hotel_No Room_No Price H01 R001 30 R002 35 R103 45 H05 R003 40 R101 50 Hotel_No Max(Room_No) Avg(Price) H01 R103 36.67 H05 R101 45
What CANNOT be selected with Group By Clause Cannot select no group by fields such as Room_No or Price ORA-00979: not a GROUP BY expression Hotel_No Room_No Price H01 R001 30 R002 35 R103 45 H05 R003 40 R101 50 Hotel_No Room_No Price H01 R001 30 R002 35 R103 45 H05 R003 40 R101 50 Hotel_No Room_No Price H01 ? H05
Group By Clause ? Select Group By ? ? One record for each group! What can be selected? Aggregate functions Group by fields
Group By One Record for each group Select Hotel_no, Count(*), Max(Price) From Room Group by Hotel_No; Select Hotel_no, Room_No, rtype, Price -- not a Group By expression
Group by more than one field Select Hotel_No, rtype, Max(Price) From Room Group By Hotel_no, rtype;
Order after Group by Group By Select Hotel_no, Count(*), Max(Price) From Room Group by Hotel_No Order by Count(*);
Group By Clause ? Select Group By ? ? What if we don’t want all groups? Having on groups Where on records
Group By Having to select groups Select Hotel_no, Count(*), Max(Price) From Room Group by Hotel_No Having Count(*) > 20;
Group By Where before Group by to select records Having after Group by to select groups Let’s do it in 4 steps: From, Where, Group By, Having Select Hotel_no, Count(*), Max(Price) From Room Where rtype = 'Single' Group by Hotel_No Having Max(Price) < 100
Group By Where before Group by Having after Group by Order by last Select Hotel_no, Count(*), Max(Price) From Room Where rtype in ('Double', 'Single') Group by Hotel_No Having Count(*) > 50 Order by Count(*);
Group By Clause Execution Order Where (condition on records) Group by Having (condition on groups) Order by (Select)
Command Prompt Prompt Prompt 9. Prompt For each hotel that has more than Prompt one Single room, list hotel number Prompt with number of Single rooms the hotel Prompt has and the highest price of Prompt such rooms of the hotel. Select Hotel_no, Count(*), Max(Price) From Room Where rtype = 'Single' Group by Hotel_No Having Count(*) > 1 Order by Count(*);
Assignment 8 Due Monday, April 10 Should work for any table instance Run against my tables Should insert more records to test (Don’t include insert commands!) Example Quiz 3 Hands-On Wednesday, April 7 Create Script file to Drop tables Create tables Column/Table constraints Insert records