177 lines
5.9 KiB
SQL
177 lines
5.9 KiB
SQL
-- Question 1 part 1 a)
|
|
CREATE TABLE Donors
|
|
(
|
|
donorID INT NOT NULL,
|
|
firstName VARCHAR(50) NOT NULL,
|
|
lastName VARCHAR(50) NOT NULL,
|
|
middleInitial CHAR(1),
|
|
dateOfBirth DATE,
|
|
address VARCHAR(100), -- might need to change to civic code only
|
|
city VARCHAR(50),
|
|
postalCode VARCHAR(7),
|
|
province ENUM (
|
|
'AB', -- Alberta
|
|
'BC', -- British Columbia
|
|
'MB', -- Manitoba
|
|
'NB', -- New Brunswick
|
|
'NL', -- Newfoundland and Labrador
|
|
'NS', -- Nova Scotia
|
|
'NT', -- Northwest Territories
|
|
'NU', -- Nunavut
|
|
'ON', -- Ontario
|
|
'PE', -- Prince Edward Island
|
|
'QC', -- Quebec
|
|
'SK', -- Saskatchewan
|
|
'YT' -- Yukon
|
|
),
|
|
gender ENUM ('M', 'F', 'U'),
|
|
SSN VARCHAR(11),
|
|
hobby VARCHAR(100),
|
|
phone VARCHAR(15),
|
|
email VARCHAR(100),
|
|
CONSTRAINT donors_pk PRIMARY KEY (donorID)
|
|
);
|
|
|
|
CREATE TABLE Donations
|
|
(
|
|
dID INT NOT NULL,
|
|
donorID INT NOT NULL,
|
|
date DATE NOT NULL,
|
|
type VARCHAR(7) NOT NULL,
|
|
amount DECIMAL(10, 2) NOT NULL,
|
|
CONSTRAINT donations_pk PRIMARY KEY (dID),
|
|
CONSTRAINT donations_donorID_fk FOREIGN KEY (donorID) REFERENCES Donors (donorID),
|
|
CONSTRAINT valid_donation_type CHECK (type IN ('money', 'product'))
|
|
);
|
|
|
|
create table Products
|
|
(
|
|
pID INT NOT NULL,
|
|
description varchar(100),
|
|
date DATE NOT NULL,
|
|
price DECIMAL(10, 2) NOT NULL,
|
|
weight DECIMAL(5, 2) NOT NULL,
|
|
CONSTRAINT products_pk PRIMARY KEY (pID)
|
|
);
|
|
|
|
CREATE TABLE Sales
|
|
(
|
|
sID INT NOT NULL,
|
|
date DATE NOT NULL,
|
|
amount DECIMAL(10, 2) NOT NULL,
|
|
totalWeight DECIMAL(10, 2) NOT NULL,
|
|
deliveryFee DECIMAL(10, 2) DEFAULT 0 NOT NULL,
|
|
CONSTRAINT sales_pk primary key (sID),
|
|
CONSTRAINT valid_delivery_fee CHECK (deliveryFee >= 0)
|
|
);
|
|
|
|
CREATE TABLE SalesItems
|
|
(
|
|
sID INT NOT NULL,
|
|
pID INT NOT NULL,
|
|
PRIMARY KEY (sID, pID),
|
|
FOREIGN KEY (sID) REFERENCES Sales (sID),
|
|
FOREIGN KEY (pID) REFERENCES Products (pID)
|
|
);
|
|
|
|
-- Question 1 part 1 b)
|
|
ALTER TABLE Donors
|
|
DROP COLUMN hobby;
|
|
|
|
-- Question 1 part 1 c)
|
|
ALTER TABLE Products
|
|
ADD location VARCHAR(50) DEFAULT 'Unknown';
|
|
ALTER TABLE Products
|
|
ADD color VARCHAR(10) DEFAULT 'Unknown';
|
|
|
|
-- Question 1 part 1 d)
|
|
-- !!! ASSUME THAT HOBBY COLUMN IS NO LONGER THERE
|
|
INSERT INTO Donors (donorID, firstName, lastName, middleInitial, dateOfBirth, address, city, postalCode, province,
|
|
gender, SSN, phone, email)
|
|
VALUES (1, 'John', 'Smith', 'A', '1985-03-15', '123 Maple St', 'Toronto', 'M5V 2T6', 'ON', 'M', '123-456-789',
|
|
'(416) 555-1234', 'john.smith@email.com');
|
|
|
|
INSERT INTO Donors (donorID, firstName, lastName, middleInitial, dateOfBirth, address, city, postalCode, province,
|
|
gender, SSN, phone, email)
|
|
VALUES (2, 'Emily', 'Johnson', 'M', '1990-07-22', '456 Oak Ave', 'Vancouver', 'V6B 3K9', 'BC', 'F', '987-654-321',
|
|
'(604) 555-5678', 'emily.j@email.com');
|
|
|
|
INSERT INTO Donors (donorID, firstName, lastName, middleInitial, dateOfBirth, address, city, postalCode, province,
|
|
gender, SSN, phone, email)
|
|
VALUES (3, 'Alex', 'Lee', NULL, '1988-11-30', '789 Pine Rd', 'Montreal', 'H3A 1A1', 'QC', 'U', '456-789-123',
|
|
'(514) 555-9012', 'alex.lee@email.com');
|
|
|
|
INSERT INTO Donations (dID, donorID, date, type, amount)
|
|
VALUES (1, 1, '2023-05-15', 'money', 100.00);
|
|
|
|
INSERT INTO Donations (dID, donorID, date, type, amount)
|
|
VALUES (2, 2, '2023-06-22', 'product', 75.50);
|
|
|
|
INSERT INTO Donations (dID, donorID, date, type, amount)
|
|
VALUES (3, 3, '2023-07-03', 'money', 250.00);
|
|
|
|
-- Question 1 part 1 e)
|
|
DELETE
|
|
FROM Donors
|
|
WHERE donorID > 0;
|
|
DELETE
|
|
FROM Donations
|
|
WHERE donorID > 0;
|
|
|
|
-- Question 1 part 1 f)
|
|
-- We have not covered ON DELETE/ ON UPDATE CASCADE
|
|
-- in class so wer have to delete in such order of statements
|
|
DROP TABLE Donations;
|
|
DROP TABLE Donors;
|
|
DROP TABLE SalesItems;
|
|
DROP TABLE Products;
|
|
DROP TABLE Sales;
|
|
|
|
-- Question 1 part 2 a)
|
|
SELECT Donors.donorID,
|
|
Donors.firstName,
|
|
Donors.lastName,
|
|
Donors.middleInitial,
|
|
Donors.dateOfBirth,
|
|
Donors.phone,
|
|
Donors.email,
|
|
Donors.SSN
|
|
FROM Donors
|
|
WHERE (Donors.gender = 'M')
|
|
AND (Donors.city = 'Montreal' OR Donors.city = 'Laval');
|
|
|
|
-- Question 1 part 2 b)
|
|
SELECT Sales.sID, Products.pID, Products.description, Products.price, Products.weight
|
|
FROM Sales,
|
|
Products
|
|
WHERE Products.color = 'red'
|
|
AND Sales.date = '2024-02-14';
|
|
|
|
-- Question 1 part 2 c)
|
|
-- One sID can have multiple products
|
|
-- We need the DISTINCT keyword
|
|
SELECT COUNT(DISTINCT sID)
|
|
FROM Sales
|
|
WHERE Sales.date = '2024-02-14';
|
|
|
|
-- Question 1 part 2 d)
|
|
SELECT EXTRACT(MONTH FROM date) AS month,
|
|
COUNT(DISTINCT sID) AS total_sales,
|
|
SUM(amount) AS total_amount,
|
|
SUM(deliveryFee) AS total_delivery_fees
|
|
FROM Sales
|
|
WHERE EXTRACT(YEAR FROM date) = 2023
|
|
GROUP BY EXTRACT(MONTH FROM date)
|
|
ORDER BY month;
|
|
|
|
-- Question 1 part 2 e)
|
|
SELECT Donors.gender, Donors.lastName, Donors.firstName, SUM(Donations.amount) AS total_donation_amount
|
|
FROM Donors,
|
|
Donations
|
|
WHERE Donors.city = 'Brossard'
|
|
AND (Donations.date > '2022-01-01')
|
|
AND (Donations.date < '2023-12-31')
|
|
GROUP BY Donors.donorID, Donors.gender, Donors.lastName, Donors.firstName
|
|
ORDER BY Donors.gender, Donors.lastName, Donors.firstName;
|
|
|