Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Practical Exercises on SQL (Part 1)

2014-2015
In this practical, you will execute all the SQL statements you wrote in Tutorial 04 and 05 in PostgreSQL, an
open-source relational database. For PostgreSQL documentation, please see postgresql.org/docs/

Step 1: Open pgAdmin, the client application for PostgreSQL.

Step 2: Connect to the database server PostgreSQL using username and password 'postgres'.
Step 3: Right-click on Databases and create a new database, 'hotel_db'.

Step 4: Use the Query Tool to execute SQL statements (given below) to create, populate and query the
hotel, room, guest and booking tables. These SQL statements were discussed in Tutorial 04 and 05.

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'hotel' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE DOMAIN HotelNumber AS CHAR(4);

CREATE TABLE Hotel (


hotelNo HotelNumber NOT NULL,
hotelName VARCHAR(20) NOT NULL,
city VARCHAR(50) NOT NULL,
PRIMARY KEY (hotelNo)
);

INSERT INTO hotel VALUES ('H001', 'The Oberoi', 'Pointe aux Piments');
INSERT INTO hotel VALUES ('H002', 'Constance Le Prince', 'Flacq');
INSERT INTO hotel VALUES ('H003', 'LUX Le Morne', 'Le Morne');
INSERT INTO hotel VALUES ('H004', 'LUX Grand Gaube', 'Grand Gaube');

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'room' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE DOMAIN RoomType AS CHAR(6)


CHECK(VALUE IN ('Single', 'Family', 'Double'));

--CREATE DOMAIN HotelNumbers AS HotelNumber


-- CHECK(VALUE IN (SELECT hotelNo FROM hotel));
-- -- ERROR: cannot use subquery in check constraint
-- -- Not supported in Postgresql

CREATE DOMAIN RoomPrice AS DECIMAL(5, 2)


CHECK(VALUE BETWEEN 10 AND 100);

CREATE DOMAIN RoomNumber AS DECIMAL(4)


CHECK(VALUE BETWEEN 1 AND 100);

CREATE TABLE Room(


roomNo RoomNumber NOT NULL,
hotelNo HotelNumber NOT NULL,
type RoomType NOT NULL DEFAULT 'Single',
price RoomPrice NOT NULL,
PRIMARY KEY (roomNo, hotelNo),
FOREIGN KEY (hotelNo) REFERENCES Hotel ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO room VALUES (1, 'H001', 'Single', '30');
INSERT INTO room VALUES (2, 'H001', 'Single', '35');
INSERT INTO room VALUES (3, 'H001', 'Double', '90');
INSERT INTO room VALUES (4, 'H001', 'Double', '92');
INSERT INTO room VALUES (1, 'H002', 'Single', '30');
INSERT INTO room VALUES (2, 'H002', 'Double', '95');
INSERT INTO room VALUES (3, 'H002', 'Double', '90');
INSERT INTO room VALUES (4, 'H002', 'Double', '92');
INSERT INTO room VALUES (1, 'H003', 'Single', '25');
INSERT INTO room VALUES (2, 'H003', 'Single', '30');
INSERT INTO room VALUES (3, 'H003', 'Double', '90');
INSERT INTO room VALUES (1, 'H004', 'Single', '25');
INSERT INTO room VALUES (2, 'H004', 'Single', '25');
INSERT INTO room VALUES (3, 'H004', 'Double', '90');

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'guest' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE DOMAIN GuestNumber AS CHAR(4);

CREATE TABLE Guest(


guestNo GuestNumber NOT NULL,
guestName VARCHAR(20) NOT NULL,
guestAddress VARCHAR(50) NOT NULL,
PRIMARY KEY (guestNo)
);

INSERT INTO guest VALUES ('G001', 'John White', '5, St James st., London, UK');
INSERT INTO guest VALUES ('G002', 'Emilie Villiers', '6, rue Teresa, Paris, France');
INSERT INTO guest VALUES ('G003', 'Sunita Jain', '15, Delhi road, Mumbai, India');
INSERT INTO guest VALUES ('G004', 'Jean Jacques', '30, rue Pima, Port-Mathurin, Rodrigues');
INSERT INTO guest VALUES ('G005', 'Susan Brand', '8, Oxford st., Melbourne, Australia');
INSERT INTO guest VALUES ('G006', 'Julie Lee', '5, St David st., Manchester, UK');
INSERT INTO guest VALUES ('G007', 'Tom Jones', '44, Halloween st., London, UK');
INSERT INTO guest VALUES ('G008', 'Paul MacCartney', '5, St James st., Liverpool, UK');
INSERT INTO guest VALUES ('G009', 'John Smith', '16, Aberdeen road, Leeds, UK');
INSERT INTO guest VALUES ('G010', 'Jenny Brown', '10, rue Stanislas, Nancy, France');

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create and populate 'booking' table
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

--CREATE DOMAIN GuestNumbers AS GuestNumber


-- CHECK(VALUE IN (SELECT guestNo FROM Guest));
-- -- ERROR: cannot use subquery in check constraint
-- -- Not supported in Postgresql

CREATE DOMAIN BookingDate AS TIMESTAMP


CHECK(VALUE > CURRENT_DATE);

CREATE TABLE Booking(


hotelNo HotelNumber NOT NULL,
guestNo GuestNumber NOT NULL,
dateFrom BookingDate NOT NULL,
dateTo BookingDate NULL,
roomNo RoomNumber NOT NULL,
PRIMARY KEY (hotelNo, guestNo, dateFrom),
FOREIGN KEY (hotelNo) REFERENCES Hotel ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (guestNo) REFERENCES Guest ON DELETE NO ACTION ON UPDATE CASCADE,
--FOREIGN KEY (hotelNo, roomNo) REFERENCES Room ON DELETE NO ACTION ON UPDATE CASCADE
);

--ALTER TABLE Booking


-- ADD CONSTRAINT RoomBooked
-- CHECK (NOT EXISTS (
-- SELECT *
-- FROM Booking b
-- WHERE b.dateTo > Booking.dateFrom
-- AND b.dateFrom < Booking.dateTo
-- AND b.roomNo = Booking.roomNo
-- AND b.hotelNo = Booking.hotelNo)) ;
-- -- ERROR: cannot use subquery in check constraint
-- -- Not supported in Postgresql

--ALTER TABLE Booking


-- ADD CONSTRAINT GuestBooked
-- CHECK (NOT EXISTS (
-- SELECT *
-- FROM Booking b
-- WHERE b.dateTo > Booking.dateFrom
-- AND b.dateFrom < Booking.dateTo
-- AND b.guestNo = Booking.guestNo )) ;
-- -- ERROR: cannot use subquery in check constraint
-- -- Not supported in Postgresql

INSERT INTO booking VALUES ('H001', 'G001', '2014-10-10', '2014-10-15', 1);


INSERT INTO booking VALUES ('H001', 'G002', '2014-10-10', '2014-10-12', 2);
INSERT INTO booking VALUES ('H001', 'G003', '2014-10-13', '2014-10-16', 2);
INSERT INTO booking VALUES ('H001', 'G004', '2014-11-09', '2014-11-10', 3);
INSERT INTO booking VALUES ('H002', 'G005', '2014-11-09', '2014-11-10', 1);
INSERT INTO booking VALUES ('H002', 'G006', '2014-11-09', '2014-11-12', 2);
INSERT INTO booking VALUES ('H002', 'G007', '2014-11-13', '2014-11-15', 2);
INSERT INTO booking VALUES ('H004', 'G008', '2014-11-13', '2014-11-15', 3);
INSERT INTO booking VALUES ('H004', 'G009', '2014-11-09', '2014-11-15', 1);
INSERT INTO booking VALUES ('H003', 'G010', '2014-11-09', '2014-11-12', 1);
INSERT INTO booking VALUES ('H001', 'G001', '2014-11-09', '2014-11-12', 1);
INSERT INTO booking VALUES ('H004', 'G005', '2014-12-12', '2014-12-13', 2);
INSERT INTO booking VALUES ('H004', 'G007', '2014-12-12', '2014-12-15', 3);
INSERT INTO booking VALUES ('H001', 'G001', '2014-12-13', '2014-12-16', 4);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a separate table with the same structure as the Booking table to hold
-- archive records.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE TABLE BookingOld(


hotelNo CHAR(4) NOT NULL,
guestNo CHAR(4) NOT NULL,
dateFrom TIMESTAMP NOT NULL,
dateTo TIMESTAMP NULL,
roomNo DECIMAL(4) NOT NULL
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Using the INSERT statement, copy the records from the Booking table to the
-- archive table relating to bookings before 1 November 2014.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

INSERT INTO BookingOld


( SELECT *
FROM Booking
WHERE dateTo < '2014-11-01'
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Delete all bookings before 1 November 2014 from the Booking table.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

DELETE FROM Booking


WHERE dateTo < '2014-11-01';

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a view containing the hotel name and the names of the guests
-- staying at the hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE VIEW HotelData(hotelName, guestName)


AS SELECT h.hotelName, g.guestName
FROM Hotel h, Guest g, Booking b
WHERE h.hotelNo = b.hotelNo
AND g.guestNo = b.guestNo
AND b.dateFrom <= CURRENT_DATE
AND b.dateTo >= CURRENT_DATE;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Create a view containing the account for each guest at 'LUX Le Morne' hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE VIEW BookingOutToday


AS SELECT g.guestNo, g.guestName, g.guestAddress,
r.price*(b.dateTo-b.dateFrom)
FROM Guest g, Booking b, Hotel h, Room r
WHERE g.guestNo = b.guestNo
AND r.roomNo = b.roomNo
AND b.hotelNo = h.hotelNo
AND h.hotelName = 'LUX Le Morne'
AND b.dateTo = CURRENT_DATE;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the users Manager and Director full access to HotelData view,
-- with the privilege to pass the access on to other users.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE USER Manager WITH PASSWORD 'manager';


CREATE USER Director WITH PASSWORD 'director';

GRANT ALL PRIVILEGES


ON HotelData
TO Manager, Director
WITH GRANT OPTION;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the users Manager and Director full access to BookingOutToday view,
-- with the privilege to pass the access on to other users.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

GRANT ALL PRIVILEGES


ON BookingOutToday
TO Manager, Director
WITH GRANT OPTION;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Give the user Accounts SELECT access to these views.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

CREATE USER Accounts WITH PASSWORD 'accounts';

GRANT SELECT ON HotelData TO Accounts;


GRANT SELECT ON BookingOutToday TO Accounts;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Now revoke the access from this user.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

REVOKE SELECT ON HotelData FROM Accounts;


REVOKE SELECT ON BookingOutToday FROM Accounts;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List full details of all hotels.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Hotel;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List full details of all hotels in 'Flacq'.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Hotel
WHERE city = 'Flacq';

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the names and addresses of all guests living in London,
-- alphabetically ordered by name.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT guestName, guestAddress


FROM Guest
WHERE guestAddress LIKE '%London%'
ORDER BY guestName;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all double or family rooms with a price below 95.00 per night,
-- in ascending order of price. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Room
WHERE price < 95
AND (type = 'Double'
OR type = 'Family')
ORDER BY price;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all double or family rooms with a price below 40.00 per night,
-- in ascending order of price. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Room
WHERE price < 95
AND type IN ('Double', 'Family')
ORDER BY price;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the bookings for which no dateTo has been specified.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Booking
WHERE dateTo IS NULL;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- How many hotels are there?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT COUNT(*)
FROM Hotel;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the average price of a room?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT AVG(price)
FROM Room;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the total revenue per night from all double rooms?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT SUM(price)
FROM Room
WHERE type = 'Double';

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- How many different guests have made bookings for November 2014?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT COUNT(DISTINCT guestNo)


FROM Booking
WHERE (dateFrom <= '2014-11-01'
AND dateTo >= '2014-11-01')
OR (dateFrom >= '2014-11-01'
AND dateFrom <= '2014-11-30');

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the price and type of all rooms at 'The Oberoi' Hotel. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT price, type


FROM Room
WHERE hotelNo =
( SELECT hotelNo
FROM Hotel
WHERE hotelName = 'The Oberoi'
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the price and type of all rooms at 'The Oberoi' Hotel. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT r.price, r.type


FROM Room r, Hotel h
WHERE h.hotelName = 'The Oberoi'
AND h.hotelNo = r.hotelNo ;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all guests currently staying at 'The Oberoi' Hotel. SOLUTION 1
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Guest
WHERE guestNo =
(SELECT guestNo
FROM Booking
WHERE dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE
AND hotelNo =
(SELECT hotelNo
FROM Hotel
WHERE hotelName = 'The Oberoi'
)
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List all guests currently staying at 'The Oberoi' Hotel. SOLUTION 2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT g.guestNo, g.guestName


FROM Guest g, Booking b, Hotel h
WHERE b.dateFrom <= CURRENT_DATE
AND b.dateTo >= CURRENT_DATE
AND h.hotelName = 'The Oberoi'
AND h.hotelNo = b.hotelNo
AND g.guestNo = g.guestNo ;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the details of all rooms at 'The Oberoi' Hotel, including the name of
-- the guest staying in the room, if the room is occupied.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT r.*
FROM Room r, Guest g, Booking b, Hotel h
WHERE hotelName= 'The Oberoi'
AND dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE
AND h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND g.guestNo = b.guestNo
AND r.roomNo = b.roomNo;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the total income from bookings for 'The Oberoi' Hotel today?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT SUM(price)
FROM Booking b, Room r, Hotel h
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND hotelName = 'The Oberoi'
AND h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND r.roomNo = b.roomNo ;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the rooms that are currently unoccupied at 'The Oberoi' Hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT *
FROM Room r, Hotel h
WHERE h.hotelNo = r.hotelNo
AND h.hotelName = 'The Oberoi'
AND roomNo NOT IN
(SELECT roomNo
FROM Booking b, Hotel hh
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND b.hotelNo = hh.hotelNo
AND hh.hotelName = 'The Oberoi'
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the lost income from unoccupied rooms at the Grosvenor Hotel?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT SUM(price)
FROM Room r, Hotel h
WHERE h.hotelNo = r.hotelNo
AND h.hotelName = 'The Oberoi'
AND roomNo NOT IN
(SELECT roomNo
FROM Booking b, Hotel hh
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND b.hotelNo = hh.hotelNo
AND hh.hotelName = 'The Oberoi'
);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the number of rooms in each hotel.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT hotelNo, COUNT(roomNo) AS count


FROM Room
GROUP BY hotelNo;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- List the number of rooms in each hotel in 'Flacq'.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT r.hotelNo, COUNT(roomNo) AS count


FROM Room r, Hotel h
WHERE r.hotelNo = h.hotelNo
AND city = 'Flacq'
GROUP BY r.hotelNo;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the average number of bookings for each hotel in August?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT AVG(temp.X)
FROM
( SELECT hotelNo, COUNT(hotelNo) AS X
FROM Booking b
WHERE (dateFrom <= '2014-11-01'
AND dateTo >= '2014-11-01')
OR (dateFrom >= '2014-11-01'
AND dateFrom <= '2014-11-30')
GROUP BY hotelNo
) AS temp;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the most commonly booked room type for each hotel in 'Flacq'?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT temp.type
FROM
( SELECT r.type, COUNT(type) AS X
FROM Booking b, Hotel h, Room r
WHERE h.hotelNo = r.hotelNo
AND h.hotelNo = b.hotelNo
AND r.hotelNo = b.hotelNo
AND r.roomNo = b.roomNo
AND h.city = 'Flacq'
GROUP BY r.type
ORDER BY X DESC
) AS temp
LIMIT 1;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- What is the lost income from unoccupied rooms at each hotel today?
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

SELECT hotelNo, SUM(price)


FROM Room r
WHERE roomNo NOT IN
(SELECT roomNo
FROM Booking b, Hotel h
WHERE (dateFrom <= CURRENT_DATE
AND dateTo >= CURRENT_DATE)
AND b.hotelNo = h.hotelNo
)
GROUP BY hotelNo;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- Update the price of all rooms by 0.5%.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

UPDATE Room
SET price = price*0.05;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

You might also like