Produce a list of costly bookings, using a subquery

Question

The Produce a list of costly bookings exercise contained some messy logic: we had to calculate the booking cost in both the WHERE clause and the CASE statement. Try to simplify this calculation using subqueries. For reference, the question was:

How can you produce a list of bookings on the day of 2012-09-14 which will cost the member (or guest) more than $30? Remember that guests have different costs to members (the listed costs are per half-hour 'slot'), and the guest user is always ID 0. Include in your output the name of the facility, the name of the member formatted as a single column, and the cost. Order by descending cost.

Expected Results

memberfacilitycost
GUEST GUESTMassage Room 2320
GUEST GUESTMassage Room 1160
GUEST GUESTMassage Room 1160
GUEST GUESTMassage Room 1160
GUEST GUESTTennis Court 2150
Jemima FarrellMassage Room 1140
GUEST GUESTTennis Court 175
GUEST GUESTTennis Court 275
GUEST GUESTTennis Court 175
Matthew GentingMassage Room 170
Florence BaderMassage Room 270
GUEST GUESTSquash Court70.0
Jemima FarrellMassage Room 170
Ponder StibbonsMassage Room 170
Burton TracyMassage Room 170
Jack SmithMassage Room 170
GUEST GUESTSquash Court35.0
GUEST GUESTSquash Court35.0

Your Answer

Your Results

Loading database...

Answers and Discussion

select member, facility, cost from (
	select 
		mems.firstname || ' ' || mems.surname as member,
		facs.name as facility,
		case
			when mems.memid = 0 then
				bks.slots*facs.guestcost
			else
				bks.slots*facs.membercost
		end as cost
		from
			cd.members mems
			inner join cd.bookings bks
				on mems.memid = bks.memid
			inner join cd.facilities facs
				on bks.facid = facs.facid
		where
			bks.starttime >= '2012-09-14' and
			bks.starttime < '2012-09-15'
	) as bookings
	where cost > 30
order by cost desc;

This answer provides a mild simplification to the previous iteration: in the no-subquery version, we had to calculate the member or guest's cost in both the WHERE clause and the CASE statement. In our new version, we produce an inline query that calculates the total booking cost for us, allowing the outer query to simply select the bookings it's looking for. For reference, you may also see subqueries in the FROM clause referred to as inline views.