cs-1011: add solution to relational db assignment
This commit is contained in:
parent
2c79f0bc12
commit
ffa7c184d2
1
Spring-2023/CS-1011/Relational-DB-Assignment/.gitignore
vendored
Normal file
1
Spring-2023/CS-1011/Relational-DB-Assignment/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.sqlite3
|
55
Spring-2023/CS-1011/Relational-DB-Assignment/README.org
Normal file
55
Spring-2023/CS-1011/Relational-DB-Assignment/README.org
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
* Databases: Relational - In-Class Assignment
|
||||||
|
|
||||||
|
You can run the queries in [[./solve.sql]] against a ~sqlite3~ database to solve this assignment
|
||||||
|
or install [[https://nixos.org/][Nix]] and run [[./solve.bash]].
|
||||||
|
|
||||||
|
** Answer the Following Questions With Info From [[*Tables]]
|
||||||
|
|
||||||
|
1. What was the total profit across all stores?
|
||||||
|
- =$34.5=
|
||||||
|
2. What is the name of the most popular product sold?
|
||||||
|
- =Toy Story=
|
||||||
|
3. How much profit did the "East" region make?
|
||||||
|
- =$13.96=
|
||||||
|
4. Which city had the highest cost?
|
||||||
|
- The city with the highest aggregate cost would be =San Francisco=.
|
||||||
|
- However, the city with the highest /single/ cost would be =New York=.
|
||||||
|
5. What was the least popular product brand?
|
||||||
|
- =Big Studios=, because they had no sales.
|
||||||
|
6. Which city (or cities) sold "Sense and Sensibility"?
|
||||||
|
- =San Francisco=
|
||||||
|
|
||||||
|
** Tables
|
||||||
|
|
||||||
|
*** STORE
|
||||||
|
| Store_key | City | Region |
|
||||||
|
|-----------|---------------|---------|
|
||||||
|
| 1 | New York | East |
|
||||||
|
| 2 | Chicago | Central |
|
||||||
|
| 3 | Atlanta | East |
|
||||||
|
| 4 | Los Angeles | West |
|
||||||
|
| 5 | San Francisco | West |
|
||||||
|
| 6 | Philadelphia | East |
|
||||||
|
|
||||||
|
*** PRODUCT
|
||||||
|
| Product_key | Description | Brand |
|
||||||
|
|-------------|-----------------------|-----------------|
|
||||||
|
| 1 | Beautiful Girls | MKF Studios |
|
||||||
|
| 2 | Toy Story | Wolf |
|
||||||
|
| 3 | Sense and Sensibility | Parabuster Inc. |
|
||||||
|
| 4 | Holday of the Year | Wolf |
|
||||||
|
| 5 | Pulp Fiction | MKF Studios |
|
||||||
|
| 6 | The Juror | MKF Studios |
|
||||||
|
| 7 | From Dusk Till Dawn | Parabuster Inc. |
|
||||||
|
| 8 | Hellraiser: Bloodline | Big Studios |
|
||||||
|
|
||||||
|
*** SALES_FACT
|
||||||
|
|
||||||
|
| Store_key | Product_key | Sales | Cost | Profit |
|
||||||
|
|-----------|-------------|-------|------|--------|
|
||||||
|
| 1 | 6 | 2.39 | 1.15 | 1.24 |
|
||||||
|
| 1 | 2 | 16.7 | 6.91 | 9.79 |
|
||||||
|
| 2 | 7 | 7.16 | 2.75 | 4.40 |
|
||||||
|
| 3 | 2 | 4.77 | 1.84 | 2.93 |
|
||||||
|
| 5 | 3 | 11.93 | 4.59 | 7.34 |
|
||||||
|
| 5 | 1 | 14.31 | 5.51 | 8.80 |
|
183
Spring-2023/CS-1011/Relational-DB-Assignment/cmds.sql
Normal file
183
Spring-2023/CS-1011/Relational-DB-Assignment/cmds.sql
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
-- ┌────────────────────┐
|
||||||
|
-- │STORE TABLE AND DATA│
|
||||||
|
-- └────────────────────┘
|
||||||
|
DROP TABLE IF EXISTS STORE;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS STORE (
|
||||||
|
Store_key INTEGER PRIMARY KEY,
|
||||||
|
City TEXT NOT NULL,
|
||||||
|
Region TEXT CHECK (Region IN ('East', 'Central', 'West')) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
STORE (Store_key, City, Region)
|
||||||
|
VALUES
|
||||||
|
(1, 'New York', 'East'),
|
||||||
|
(2, 'Chicago', 'Central'),
|
||||||
|
(3, 'Atlanta', 'East'),
|
||||||
|
(4, 'Los Angeles', 'West'),
|
||||||
|
(5, 'San Francisco', 'West'),
|
||||||
|
(6, 'Philadelphia', 'East');
|
||||||
|
|
||||||
|
-- ┌──────────────────────┐
|
||||||
|
-- │PRODUCT TABLE AND DATA│
|
||||||
|
-- └──────────────────────┘
|
||||||
|
DROP TABLE IF EXISTS PRODUCT;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS PRODUCT (
|
||||||
|
Product_key INTEGER PRIMARY KEY,
|
||||||
|
Description TEXT NOT NULL,
|
||||||
|
Brand TEXT CHECK (
|
||||||
|
Brand IN (
|
||||||
|
'MKF Studios',
|
||||||
|
'Wolf',
|
||||||
|
'Parabuster Inc.',
|
||||||
|
'Big Studios'
|
||||||
|
)
|
||||||
|
) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
PRODUCT (Product_key, Description, Brand)
|
||||||
|
VALUES
|
||||||
|
(1, 'Beautiful Girls', 'MKF Studios'),
|
||||||
|
(2, 'Toy Story', 'Wolf'),
|
||||||
|
(3, 'Sense and Sensibility', 'Parabuster Inc.'),
|
||||||
|
(4, 'Holday of the Year', 'Wolf'),
|
||||||
|
(5, 'Pulp Fiction', 'MKF Studios'),
|
||||||
|
(6, 'The Juror', 'MKF Studios'),
|
||||||
|
(7, 'From Dusk Till Dawn', 'Parabuster Inc.'),
|
||||||
|
(8, 'Hellraiser: Bloodline', 'Big Studios');
|
||||||
|
|
||||||
|
-- ┌─────────────────────────┐
|
||||||
|
-- │SALES_FACT TABLE AND DATA│
|
||||||
|
-- └─────────────────────────┘
|
||||||
|
DROP TABLE IF EXISTS SALES_FACT;
|
||||||
|
|
||||||
|
-- WARN: Storing money AS floats/`REAL` is a big no-no in a real application due to floating point
|
||||||
|
-- rounding errors. For this purpose it's ok, but for the love of god and all that is holy do NOT
|
||||||
|
-- store money AS a float.
|
||||||
|
CREATE TABLE IF NOT EXISTS SALES_FACT (
|
||||||
|
Store_key INTEGER NOT NULL,
|
||||||
|
Product_key INTEGER NOT NULL,
|
||||||
|
Sales REAL NOT NULL,
|
||||||
|
Cost REAL NOT NULL,
|
||||||
|
Profit REAL NOT NULL,
|
||||||
|
FOREIGN KEY (Store_key) REFERENCES STORE (Store_key),
|
||||||
|
FOREIGN KEY (Product_key) REFERENCES PRODUCT (Product_key)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
SALES_FACT (Store_key, Product_key, Sales, Cost, Profit)
|
||||||
|
VALUES
|
||||||
|
(1, 6, 2.39, 1.15, 1.24),
|
||||||
|
(1, 2, 16.7, 6.91, 9.79),
|
||||||
|
(2, 7, 7.16, 2.75, 4.40),
|
||||||
|
(3, 2, 4.77, 1.84, 2.93),
|
||||||
|
(5, 3, 11.93, 4.59, 7.34),
|
||||||
|
(5, 1, 14.31, 5.51, 8.80);
|
||||||
|
|
||||||
|
--- Answers to Questions ---
|
||||||
|
-- 1. What was the total profit across all stores?
|
||||||
|
SELECT
|
||||||
|
Sum(Profit) AS "Total Profit Across All Stores"
|
||||||
|
FROM
|
||||||
|
SALES_FACT;
|
||||||
|
|
||||||
|
-- 2. What is the name of the most popular product sold?
|
||||||
|
SELECT
|
||||||
|
Description AS "Name of Most Popular Product"
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
Max(sf.Sales),
|
||||||
|
p.Description
|
||||||
|
FROM
|
||||||
|
SALES_FACT AS sf
|
||||||
|
INNER JOIN PRODUCT p ON p.Product_key = sf.Product_key
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 3. How much profit did the "East" region make?
|
||||||
|
SELECT
|
||||||
|
Sum(Profit) AS "East Region Profits"
|
||||||
|
FROM
|
||||||
|
SALES_FACT AS sf
|
||||||
|
INNER JOIN STORE AS s ON s.Store_key = sf.Store_key
|
||||||
|
AND s.REGION = 'East';
|
||||||
|
|
||||||
|
-- 4. Which city had the highest cost?
|
||||||
|
SELECT
|
||||||
|
City AS "City With Highest Aggregate Cost"
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
s.Store_key,
|
||||||
|
Max(cost_sums) AS "Total Cost",
|
||||||
|
City
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
Store_key,
|
||||||
|
Sum(Cost) AS cost_sums
|
||||||
|
FROM
|
||||||
|
SALES_FACT
|
||||||
|
GROUP BY
|
||||||
|
Store_key
|
||||||
|
) AS sf
|
||||||
|
INNER JOIN STORE AS s ON s.Store_key = sf.Store_key
|
||||||
|
);
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
City as "City With Highest Single Cost"
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
City,
|
||||||
|
Max(Cost)
|
||||||
|
FROM
|
||||||
|
SALES_FACT AS sf
|
||||||
|
INNER JOIN STORE AS s ON s.Store_key = sf.Store_key
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 5. What was the least popular product brand?
|
||||||
|
SELECT
|
||||||
|
Brand as "Least Popular Brand"
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
Brand,
|
||||||
|
MIN(sales_sums)
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
p.Brand,
|
||||||
|
Sum(IfNull (Sales, 0)) AS sales_sums
|
||||||
|
FROM
|
||||||
|
SALES_FACT AS sf
|
||||||
|
RIGHT JOIN PRODUCT AS p ON sf.Product_key = p.Product_key
|
||||||
|
GROUP BY
|
||||||
|
p.Brand
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 6. Which city (or cities) sold "Sense and Sensibility"?
|
||||||
|
SELECT
|
||||||
|
City AS "City That Sold 'Sense and Sensibility'"
|
||||||
|
FROM
|
||||||
|
STORE AS s
|
||||||
|
WHERE
|
||||||
|
s.Store_key = (
|
||||||
|
SELECT
|
||||||
|
sf.Store_key
|
||||||
|
FROM
|
||||||
|
SALES_FACT as sf
|
||||||
|
WHERE
|
||||||
|
sf.Product_key = (
|
||||||
|
SELECT
|
||||||
|
p.Product_key
|
||||||
|
FROM
|
||||||
|
PRODUCT AS p
|
||||||
|
WHERE
|
||||||
|
p.Description = 'Sense and Sensibility'
|
||||||
|
)
|
||||||
|
);
|
20
Spring-2023/CS-1011/Relational-DB-Assignment/solve.bash
Executable file
20
Spring-2023/CS-1011/Relational-DB-Assignment/solve.bash
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env -S nix shell nixpkgs#bash nixpkgs#sqlite --command bash
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local count=1
|
||||||
|
local double_answer=false
|
||||||
|
printf "Question Solutions\n"
|
||||||
|
printf "==================\n"
|
||||||
|
while IFS= read -r line; do
|
||||||
|
# This is an ugly hack, but I'm too lazy to do this "right". Question 4 has two possible
|
||||||
|
# answers based on your interpretation, thus I am outputting two answers for question 4 by
|
||||||
|
# doing this fugly stuff.
|
||||||
|
if ((count == 5)) && ! $double_answer; then
|
||||||
|
((count--))
|
||||||
|
double_answer=true
|
||||||
|
fi
|
||||||
|
printf "%d: %s\n" $((count++)) "${line}"
|
||||||
|
done < <(sqlite3 db.sqlite3 <./cmds.sql)
|
||||||
|
}
|
||||||
|
|
||||||
|
main "${@}"
|
Loading…
Reference in New Issue
Block a user