diff --git a/02_activities/assignments/Microcredential_Cohort/assignment1.sql b/02_activities/assignments/Microcredential_Cohort/assignment1.sql
index 2ec561e2a..9bc20dcfb 100644
--- a/02_activities/assignments/Microcredential_Cohort/assignment1.sql
+++ b/02_activities/assignments/Microcredential_Cohort/assignment1.sql
@@ -7,7 +7,8 @@
/* 1. Write a query that returns everything in the customer table. */
--QUERY 1
-
+SELECT *
+FROM customer;
--END QUERY
@@ -17,7 +18,10 @@
sorted by customer_last_name, then customer_first_ name. */
--QUERY 2
-
+SELECT *
+FROM customer
+ORDER BY customer_last_name, customer_first_name
+LIMIT 10;
--END QUERY
@@ -28,7 +32,11 @@ sorted by customer_last_name, then customer_first_ name. */
Limit to 25 rows of output. */
--QUERY 3
-
+SELECT *
+FROM customer_purchases
+WHERE product_id = 4
+ OR product_id = 9
+LIMIT 25;
--END QUERY
@@ -43,9 +51,11 @@ Limit to 25 rows of output.
*/
--QUERY 4
-
-
-
+SELECT *,
+ quantity * cost_per_quantity AS price
+FROM customer_purchases
+WHERE customer_id BETWEEN 8 AND 10
+LIMIT 25;
--END QUERY
@@ -56,7 +66,13 @@ columns and add a column called prod_qty_type_condensed that displays the word
if the product_qty_type is “unit,” and otherwise displays the word “bulk.” */
--QUERY 5
-
+SELECT product_id,
+ product_name,
+ CASE
+ WHEN product_qty_type = 'unit' THEN 'unit'
+ ELSE 'bulk'
+ END AS prod_qty_type_condensed
+FROM product;
--END QUERY
@@ -67,6 +83,17 @@ add a column to the previous query called pepper_flag that outputs a 1 if the pr
contains the word “pepper” (regardless of capitalization), and otherwise outputs 0. */
--QUERY 6
+SELECT product_id,
+ product_name,
+ CASE
+ WHEN product_qty_type = 'unit' THEN 'unit'
+ ELSE 'bulk'
+ END AS prod_qty_type_condensed,
+ CASE
+ WHEN LOWER(product_name) LIKE '%pepper%' THEN 1
+ ELSE 0
+ END AS pepper_flag
+FROM product;
@@ -79,6 +106,12 @@ vendor_id field they both have in common, and sorts the result by market_date, t
Limit to 24 rows of output. */
--QUERY 7
+SELECT *
+FROM vendor AS v
+INNER JOIN vendor_booth_assignments AS vba
+ ON v.vendor_id = vba.vendor_id
+ORDER BY vba.market_date, v.vendor_name
+LIMIT 24;
@@ -93,7 +126,11 @@ Limit to 24 rows of output. */
at the farmer’s market by counting the vendor booth assignments per vendor_id. */
--QUERY 8
-
+SELECT vendor_id,
+ COUNT(*) AS booth_rental_count
+FROM vendor_booth_assignments
+GROUP BY vendor_id
+ORDER BY vendor_id;
--END QUERY
@@ -106,7 +143,19 @@ of customers for them to give stickers to, sorted by last name, then first name.
HINT: This query requires you to join two tables, use an aggregate function, and use the HAVING keyword. */
--QUERY 9
-
+SELECT c.customer_id,
+ c.customer_first_name,
+ c.customer_last_name,
+ SUM(cp.quantity * cp.cost_per_quantity) AS total_spent
+FROM customer AS c
+INNER JOIN customer_purchases AS cp
+ ON c.customer_id = cp.customer_id
+GROUP BY c.customer_id,
+ c.customer_first_name,
+ c.customer_last_name
+HAVING SUM(cp.quantity * cp.cost_per_quantity) > 2000
+ORDER BY c.customer_last_name,
+ c.customer_first_name;
--END QUERY
@@ -125,6 +174,28 @@ VALUES(col1,col2,col3,col4,col5)
*/
--QUERY 10
+DROP TABLE IF EXISTS temp.new_vendor;
+
+CREATE TEMP TABLE new_vendor AS
+SELECT *
+FROM vendor;
+
+INSERT INTO new_vendor (
+ vendor_id,
+ vendor_name,
+ vendor_type,
+ vendor_owner_first_name,
+ vendor_owner_last_name
+)
+VALUES (
+ 10,
+ 'Thomass Superfood Store',
+ 'Fresh Focused',
+ 'Thomas',
+ 'Rosenthal'
+);
+
+
@@ -139,7 +210,11 @@ and year are!
Limit to 25 rows of output. */
--QUERY 11
-
+SELECT customer_id,
+ strftime('%m', market_date) AS month,
+ strftime('%Y', market_date) AS year
+FROM customer_purchases
+LIMIT 25;
--END QUERY
@@ -153,7 +228,13 @@ but remember, STRFTIME returns a STRING for your WHERE statement...
AND be sure you remove the LIMIT from the previous query before aggregating!! */
--QUERY 12
-
+SELECT customer_id,
+ SUM(quantity * cost_per_quantity) AS total_spent
+FROM customer_purchases
+WHERE strftime('%m', market_date) = '04'
+ AND strftime('%Y', market_date) = '2022'
+GROUP BY customer_id
+ORDER BY customer_id;
--END QUERY
diff --git a/02_activities/assignments/Microcredential_Cohort/assignment2.sql b/02_activities/assignments/Microcredential_Cohort/assignment2.sql
index 4079c18ae..2dc040f69 100644
--- a/02_activities/assignments/Microcredential_Cohort/assignment2.sql
+++ b/02_activities/assignments/Microcredential_Cohort/assignment2.sql
@@ -21,9 +21,12 @@ nulls, and 'unit' for the second column with nulls.
The `||` values concatenate the columns into strings.
Edit the appropriate columns -- you're making two edits -- and the NULL rows will be fixed.
All the other rows will remain the same. */
---QUERY 1
-
+--QUERY 1
+SELECT product_name || ', ' ||
+ COALESCE(product_size, '') ||
+ ' (' || COALESCE(product_qty_type, 'unit') || ')'
+FROM product;
--END QUERY
@@ -41,7 +44,20 @@ HINT: One of these approaches uses ROW_NUMBER() and one uses DENSE_RANK().
Filter the visits to dates before April 29, 2022. */
--QUERY 2
-
+SELECT customer_id,
+ market_date,
+ ROW_NUMBER() OVER (
+ PARTITION BY customer_id
+ ORDER BY market_date
+ ) AS visit_number
+FROM (
+ SELECT DISTINCT customer_id,
+ market_date
+ FROM customer_purchases
+ WHERE market_date < '2022-04-29'
+)
+ORDER BY customer_id,
+ market_date;
--END QUERY
@@ -53,7 +69,24 @@ only the customer’s most recent visit.
HINT: Do not use the previous visit dates filter. */
--QUERY 3
-
+SELECT customer_id,
+ market_date,
+ visit_number
+FROM (
+ SELECT customer_id,
+ market_date,
+ ROW_NUMBER() OVER (
+ PARTITION BY customer_id
+ ORDER BY market_date DESC
+ ) AS visit_number
+ FROM (
+ SELECT DISTINCT customer_id,
+ market_date
+ FROM customer_purchases
+ )
+)
+WHERE visit_number = 1
+ORDER BY customer_id;
--END QUERY
@@ -66,7 +99,16 @@ You can make this a running count by including an ORDER BY within the PARTITION
Filter the visits to dates before April 29, 2022. */
--QUERY 4
-
+SELECT *,
+ COUNT(*) OVER (
+ PARTITION BY customer_id,
+ product_id
+ ) AS customer_product_purchase_count
+FROM customer_purchases
+WHERE market_date < '2022-04-29'
+ORDER BY customer_id,
+ product_id,
+ market_date;
--END QUERY
@@ -85,7 +127,17 @@ Remove any trailing or leading whitespaces. Don't just use a case statement for
Hint: you might need to use INSTR(product_name,'-') to find the hyphens. INSTR will help split the column. */
--QUERY 5
-
+SELECT product_name,
+ NULLIF(
+ TRIM(
+ SUBSTR(
+ product_name,
+ INSTR(product_name, '-') + 1
+ )
+ ),
+ TRIM(product_name)
+ ) AS description
+FROM product;
--END QUERY
@@ -94,6 +146,11 @@ Hint: you might need to use INSTR(product_name,'-') to find the hyphens. INSTR w
/* 2. Filter the query to show any product_size value that contain a number with REGEXP. */
--QUERY 6
+SELECT product_id,
+ product_name,
+ product_size
+FROM product
+WHERE product_size REGEXP '[0-9]';
@@ -111,7 +168,37 @@ HINT: There are a possibly a few ways to do this query, but if you're struggling
with a UNION binding them. */
--QUERY 7
-
+WITH sales_by_date AS (
+ SELECT market_date,
+ SUM(quantity * cost_per_quantity) AS total_sales
+ FROM customer_purchases
+ GROUP BY market_date
+),
+ranked_sales AS (
+ SELECT market_date,
+ total_sales,
+ RANK() OVER (
+ ORDER BY total_sales DESC
+ ) AS highest_sales_rank,
+ RANK() OVER (
+ ORDER BY total_sales
+ ) AS lowest_sales_rank
+ FROM sales_by_date
+)
+
+SELECT market_date,
+ total_sales,
+ 'Highest sales' AS sales_result
+FROM ranked_sales
+WHERE highest_sales_rank = 1
+
+UNION
+
+SELECT market_date,
+ total_sales,
+ 'Lowest sales' AS sales_result
+FROM ranked_sales
+WHERE lowest_sales_rank = 1;
--END QUERY
@@ -132,7 +219,24 @@ How many customers are there (y).
Before your final group by you should have the product of those two queries (x*y). */
--QUERY 8
-
+SELECT v.vendor_name,
+ p.product_name,
+ SUM(vi.product_revenue) AS total_revenue
+FROM (
+ SELECT DISTINCT vendor_id,
+ product_id,
+ original_price * 5 AS product_revenue
+ FROM vendor_inventory
+) AS vi
+CROSS JOIN customer AS c
+INNER JOIN vendor AS v
+ ON vi.vendor_id = v.vendor_id
+INNER JOIN product AS p
+ ON vi.product_id = p.product_id
+GROUP BY v.vendor_name,
+ p.product_name
+ORDER BY v.vendor_name,
+ p.product_name;
--END QUERY
@@ -145,7 +249,11 @@ It should use all of the columns from the product table, as well as a new column
Name the timestamp column `snapshot_timestamp`. */
--QUERY 9
-
+CREATE TABLE product_units AS
+SELECT *,
+ CURRENT_TIMESTAMP AS snapshot_timestamp
+FROM product
+WHERE product_qty_type = 'unit';
--END QUERY
@@ -155,7 +263,22 @@ Name the timestamp column `snapshot_timestamp`. */
This can be any product you desire (e.g. add another record for Apple Pie). */
--QUERY 10
-
+INSERT INTO product_units (
+ product_id,
+ product_name,
+ product_size,
+ product_category_id,
+ product_qty_type,
+ snapshot_timestamp
+)
+SELECT product_id,
+ product_name,
+ product_size,
+ product_category_id,
+ product_qty_type,
+ CURRENT_TIMESTAMP
+FROM product
+WHERE product_id = 7;
--END QUERY
@@ -167,8 +290,13 @@ This can be any product you desire (e.g. add another record for Apple Pie). */
HINT: If you don't specify a WHERE clause, you are going to have a bad time.*/
--QUERY 11
-
-
+DELETE FROM product_units
+WHERE product_id = 7
+ AND snapshot_timestamp = (
+ SELECT MIN(snapshot_timestamp)
+ FROM product_units
+ WHERE product_id = 7
+ );
--END QUERY
@@ -191,7 +319,20 @@ Finally, make sure you have a WHERE statement to update the right row,
When you have all of these components, you can run the update statement. */
--QUERY 12
+ALTER TABLE product_units
+ADD current_quantity INT;
+UPDATE product_units
+SET current_quantity = COALESCE(
+ (
+ SELECT vi.quantity
+ FROM vendor_inventory AS vi
+ WHERE vi.product_id = product_units.product_id
+ ORDER BY vi.market_date DESC
+ LIMIT 1
+ ),
+ 0
+);
--END QUERY
diff --git a/02_activities/assignments/Microcredential_Cohort/images/Prompt_1.drawio.png b/02_activities/assignments/Microcredential_Cohort/images/Prompt_1.drawio.png
new file mode 100644
index 000000000..dd39ff726
Binary files /dev/null and b/02_activities/assignments/Microcredential_Cohort/images/Prompt_1.drawio.png differ
diff --git a/02_activities/assignments/Microcredential_Cohort/images/Prompt_2.drawio.png b/02_activities/assignments/Microcredential_Cohort/images/Prompt_2.drawio.png
new file mode 100644
index 000000000..53894b1f1
Binary files /dev/null and b/02_activities/assignments/Microcredential_Cohort/images/Prompt_2.drawio.png differ
diff --git a/02_activities/assignments/Microcredential_Cohort/images/Prompt_3.drawio.png b/02_activities/assignments/Microcredential_Cohort/images/Prompt_3.drawio.png
new file mode 100644
index 000000000..fed489bbb
Binary files /dev/null and b/02_activities/assignments/Microcredential_Cohort/images/Prompt_3.drawio.png differ
diff --git a/04_this_cohort/live_code/module2_personal.sql b/04_this_cohort/live_code/module2_personal.sql
new file mode 100644
index 000000000..4933449cb
--- /dev/null
+++ b/04_this_cohort/live_code/module2_personal.sql
@@ -0,0 +1,31 @@
+/* MODULE 2 */
+/* SELECT */
+
+
+/* 1. Select everything in the customer table */
+SELECT * FROM customer;
+
+/* 2. Use sql as a calculator */
+SELECT 1+1 AS addition,
+10*5 AS multiplacation, pi() as pi;
+
+
+/* 3. Add order by and limit clauses */
+SELECT * FROM customer
+ORDER BY customer_first_name DESC
+LIMIT 10;
+
+
+/* 4. Select multiple specific columns */
+SELECT
+customer_first_name,
+customer_last_name,
+customer_postal_code
+
+FROM customer;
+
+/* 5. Add a static value in a column */
+SELECT 2026 as this_year, 'July' as this_month, customer_id
+FROM customer
+
+--------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/04_this_cohort/live_code/module_2/module_2.sqbpro b/04_this_cohort/live_code/module_2/module_2.sqbpro
index 0719e69a4..1c97d7a8f 100644
--- a/04_this_cohort/live_code/module_2/module_2.sqbpro
+++ b/04_this_cohort/live_code/module_2/module_2.sqbpro
@@ -1,181 +1,262 @@
-/* MODULE 2 */
-/* SELECT */
-
-
-/* 1. Select everything in the customer table */
-SELECT
-
-/* 2. Use sql as a calculator */
-
-
-
-/* 3. Add order by and limit clauses */
-
-
-
-/* 4. Select multiple specific columns */
-
-
-
-/* 5. Add a static value in a column */
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* WHERE */
-
-/* 1. Select only customer 1 from the customer table */
-SELECT *
-FROM customer
-WHERE
-
-
-/* 2. Differentiate between AND and OR */
-
-
-
-/* 3. IN */
-
-
-
-/* 4. LIKE */
-
-
-
-/* 5. Nulls and Blanks*/
-
-
-
-/* 6. BETWEEN x AND y */
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* CASE */
-
-
-SELECT *
-/* 1. Add a CASE statement declaring which days vendors should come */
-
-
-/* 2. Add another CASE statement for Pie Day */
-
-
-
-/* 3. Add another CASE statement with an ELSE clause to handle rows evaluating to False */
-
-
-
-FROM vendor
-
-/* 4. Experiment with selecting a different column instead of just a string value */
-
-
-
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* DISTINCT */
-
-
-/* 1. Compare how many customer_ids are in the customer_purchases table, one select with distinct, one without */
-
--- 4221 rows
-SELECT customer_id FROM customer_purchases
-
-
-
-/* 2. Compare the difference between selecting market_day in market_date_info, with and without distinct:
- what do these difference mean?*/
-
-
-
-/* 3. Which vendor has sold products to a customer */
-
-
-
-/* 4. Which vendor has sold products to a customer ... and which product was it */
-
-
-
-/* 5. Which vendor has sold products to a customer
-... and which product was it?
-... AND to whom was it sold*/
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* INNER JOIN */
-
-
-/* 1. Get product names (from product table) alongside customer_purchases
- ... use an INNER JOIN to see only products that have been purchased */
-
--- without table aliases
-
-
-
-
-/* 2. Using the Query #5 from DISTINCT earlier
- (Which vendor has sold products to a customer AND which product was it AND to whom was it sold)
-
- Add customers' first and last names with an INNER JOIN */
-
--- using table aliases
-
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* LEFT JOIN */
-
-
-/* 1. There are products that have been bought
-... but are there products that have not been bought?
-Use a LEFT JOIN to find out*/
-
-
-/* 2. Directions of LEFT JOINs matter ...*/
-
-
-
-
-/* 3. As do which values you filter on ... */
-
-
-
-
-/* 4. Without using a RIGHT JOIN, make this query return the RIGHT JOIN result set
-...**Hint, flip the order of the joins** ...
-
-SELECT *
-
-FROM product_category AS pc
-LEFT JOIN product AS p
- ON pc.product_category_id = p.product_category_id
- ORDER by pc.product_category_id
-
-...Note how the row count changed from 24 to 23
-*/
-
-
-
---------------------------------------------------------------------------------------------------------------------------------------------
-/* MODULE 2 */
-/* Multiple Table JOINs */
-
-
-/* 1. Using the Query #5 from DISTINCT earlier
- (Which vendor has sold products to a customer AND which product was it AND to whom was it sold)
-
- Replace all the IDs (customer, vendor, and product) with the names instead*/
-
-
-
-/* 2. Select product_category_name, everything from the product table, and then LEFT JOIN the customer_purchases table
-... how does this LEFT JOIN affect the number of rows?
-
-Why do we have more rows now?*/
-
-
+-- Reference to file "C:/Users/vijda/OneDrive/Desktop/DSI_Class/repos/SQL/sql/04_this_cohort/live_code/module2_personal.sql" (not supported by this version) --/* MODULE 2 */
+/* WHERE */
+
+/* 1. Select only customer 1 from the customer table */
+SELECT *
+FROM customer
+WHERE customer_id = 1;
+
+
+
+/* 2. Differentiate between AND and OR */
+SELECT *
+FROM customer
+WHERE customer_id = 1
+OR customer_id = 2;
+
+
+
+/* 3. IN */
+SELECT*
+FROM customer
+WHERE customer_id IN (3,4,5,6,7);
+
+
+/* 4. LIKE */
+
+SELECT * FROM product
+WHERE product_name LIKE '%pepper%';
+
+
+/* 5. Nulls and Blanks*/
+SELECT * FROM product
+WHERE product_size IS NULL
+OR product_size = '';
+
+
+/* 6. BETWEEN x AND y */
+SELECT *
+FROM customer
+WHERE customer_id BETWEEN 1 AND 20;
+
+--------------------------------------------------------------------------------------------------------------------------------------------
+/* MODULE 2 */
+/* CASE */
+
+
+SELECT *
+/* 1. Add a CASE statement declaring which days vendors should come */
+
+,CASE WHEN vendor_type = 'Fresh Focused' THEN 'Wednesday'
+ WHEN vendor_type = 'Eggs & Meats' THEN 'Thursday'
+ ELSE 'Saturday'
+ END as day_of_specialty
+
+
+
+/* 2. Add another CASE statement for Pie Day */
+,CASE WHEN vendor_name = "Annie's Pies" -- double quotes okay here
+ THEN 'Annie is the best'
+ END as pie_day
+
+
+
+
+/* 3. Add another CASE statement with an ELSE clause to handle rows evaluating to False */
+,CASE WHEN vendor_name LIKE '%pie%'
+ THEN 'Wednesday' -- this came first for Annie even though she sells Prepared Foods too
+ WHEN vendor_type = 'Prepared Foods'
+ THEN 'Thursday'
+ ELSE 'Friday'
+ END as pies_special_day
+
+FROM vendor;
+
+/* 4. Experiment with selecting a different column instead of just a string value */
+
+SELECT *
+,CASE WHEN cost_per_quantity < 1.00
+ THEN cost_per_quantity*5
+ ELSE cost_per_quantity
+ END as inflation
+
+FROM customer_purchases
+
+
+
+--------------------------------------------------------------------------------------------------------------------------------------------
+/* MODULE 2 */
+/* DISTINCT */
+
+
+/* 1. Compare how many customer_ids are in the customer_purchases table, one select with distinct, one without */
+
+-- 4221 rows
+SELECT customer_id FROM customer_purchases;
+
+SELECT DISTINCT customer_id FROM customer_purchases;
+
+
+/* 2. Compare the difference between selecting market_day in market_date_info, with and without distinct:
+ what do these difference mean?*/
+
+ -- market is open for 150 days
+SELECT market_day
+FROM market_date_info;
+
+-- market is only open 2 days, saturday and wednesday
+SELECT DISTINCT market_day
+FROM market_date_info;
+
+
+/* 3. Which vendor has sold products to a customer */
+
+SELECT DISTINCT vendor_id
+FROM customer_purchases;
+-- only 3 vendors have sold anything at the farmers market :(
+
+/* 4. Which vendor has sold products to a customer ... and which product was it */
+
+SELECT DISTINCT vendor_id, product_id
+FROM customer_purchases;
+
+/* 5. Which vendor has sold products to a customer
+... and which product was it?
+... AND to whom was it sold*/
+
+SELECT DISTINCT vendor_id, product_id, customer_id
+FROM customer_purchases;
+--------------------------------------------------------------------------------------------------------------------------------------------
+/* MODULE 2 */
+/* INNER JOIN */
+
+
+/* 1. Get product names (from product table) alongside customer_purchases
+ ... use an INNER JOIN to see only products that have been purchased */
+
+-- without table aliases
+
+SELECT product_name, -- coming from the product TABLE
+vendor_id, -- rest of these are coming from customer_purchases table
+market_date,
+customer_id,
+customer_purchases.product_id,
+product.product_id
+
+
+FROM product
+INNER JOIN customer_purchases
+ ON customer_purchases.product_id = product.product_id;
+
+
+/* 2. Using the Query #5 from DISTINCT earlier
+ (Which vendor has sold products to a customer AND which product was it AND to whom was it sold)
+
+ Add customers' first and last names with an INNER JOIN */
+
+-- using table aliases
+
+SELECT DISTINCT
+vendor_id, -- coming from cp
+product_id, -- coming from cp
+c.customer_id, -- coming from c (and below)
+customer_first_name,
+customer_last_name
+
+FROM customer_purchases AS cp
+INNER JOIN customer AS c
+ ON cp.customer_id = c.customer_id
+
+--------------------------------------------------------------------------------------------------------------------------------------------
+/* MODULE 2 */
+/* LEFT JOIN */
+
+
+/* 1. There are products that have been bought
+... but are there products that have not been bought?
+Use a LEFT JOIN to find out*/
+
+SELECT DISTINCT
+p.product_id
+,cp.product_id as [cp_product_id]
+,product_name
+
+FROM product as p
+LEFT JOIN customer_purchases as cp
+ ON p.product_id = cp.product_id;
+
+
+/* 2. Directions of LEFT JOINs matter ...*/
+
+SELECT DISTINCT
+p.product_id
+,cp.product_id as [cp_product_id]
+,product_name
+
+FROM customer_purchases as cp
+LEFT JOIN product as p
+ ON p.product_id = cp.product_id;
+
+
+
+/* 3. As do which values you filter on ... */
+
+SELECT DISTINCT
+p.product_id
+,cp.product_id as [cp_product_id]
+,product_name
+
+FROM product as p
+LEFT JOIN customer_purchases as cp
+ ON p.product_id = cp.product_id
+WHERE cp.product_id BETWEEN 1 AND 6;
+
+
+/* 4. Without using a RIGHT JOIN, make this query return the RIGHT JOIN result set
+...**Hint, flip the order of the joins** ...
+
+SELECT *
+
+FROM product_category AS pc
+LEFT JOIN product AS p
+ ON pc.product_category_id = p.product_category_id
+ ORDER by pc.product_category_id
+
+...Note how the row count changed from 24 to 23
+*/
+
+SELECT *
+
+FROM product AS p
+LEFT JOIN product_category AS pc
+ ON pc.product_category_id = p.product_category_id
+
+ORDER by pc.product_category_id
+
+--------------------------------------------------------------------------------------------------------------------------------------------
+/* MODULE 2 */
+/* Multiple Table JOINs */
+
+
+/* 1. Using the Query #5 from DISTINCT earlier
+ (Which vendor has sold products to a customer AND which product was it AND to whom was it sold)
+
+ Replace all the IDs (customer, vendor, and product) with the names instead*/
+
+/* 2. We want to flag all of the different types of pepper products that are sold at the market.
+add a column to the previous query called pepper_flag that outputs a 1 if the product_name
+contains the word “pepper” (regardless of capitalization), and otherwise outputs 0. */
+--QUERY 6
+
+
+
+
+
+--END QUERY
+
+/* 2. Select product_category_name, everything from the product table, and then LEFT JOIN the customer_purchases table
+... how does this LEFT JOIN affect the number of rows?
+
+Why do we have more rows now?*/
+
+
diff --git a/04_this_cohort/live_code/module_3/module_3.sqbpro b/04_this_cohort/live_code/module_3/module_3.sqbpro
index 35cd56eb0..25a8b2a1f 100644
--- a/04_this_cohort/live_code/module_3/module_3.sqbpro
+++ b/04_this_cohort/live_code/module_3/module_3.sqbpro
@@ -161,16 +161,32 @@ SELECT
/* 1. now */
+
SELECT
+DATE('now','localtime') as [now]
+,DATETIME('now') as [UTC-now]
/* 2. strftime */
+,strftime('%Y/%m','now') as year_month
+,strftime('%Y %m %d','now','+50 days') as [the_future];
+
+SELECT DISTINCT
+market_date
+,strftime('%m-%d-%Y', market_date,'+50 days','-1 year') as the_past
+
+FROM market_date_info;
/* 3. adding dates, e.g. last date of the month */
+SELECT
+market_date
+,DATE(market_date, 'start of month','-1 day') as end_of_prev_month
+,DATE(market_date,'start of month','-1 day','start of month') as start_of_prev_month
+FROM market_date_info;
/* 4. difference between dates,
a. number of days between now and each market_date
@@ -178,3 +194,10 @@ SELECT
c. number of HOURS bewtween now and market_date
*/
+
+ SELECT market_date
+ ,julianday('now') - julianday(market_date) as datesbetweenmarketdate
+ ,(julianday('now') - julianday(market_date)) / 365.25 as yearsbetweenmktdate
+ ,(julianday('now') - julianday(market_date)) * 24 as hrsbetweenmktdate
+
+ FROM market_date_info
\ No newline at end of file
diff --git a/04_this_cohort/live_code/module_4/module_4.sqbpro b/04_this_cohort/live_code/module_4/module_4.sqbpro
index 55fe883e1..a4c239e5f 100644
--- a/04_this_cohort/live_code/module_4/module_4.sqbpro
+++ b/04_this_cohort/live_code/module_4/module_4.sqbpro
@@ -4,20 +4,36 @@
/* 1. IFNULL: Missing product_size, missing product_qty_type */
+SELECT *
+,IFNULL(product_size, 'Unknown') as new_product_size
+,IFNULL(product_size,product_qty_type) as silly_replacement
/* 2. Coalesce */
+,coalesce(product_size,product_qty_type,'missing') as more_replacement -- if the first value is null, then replace with the second value, if that is null, replace with the word "missing"
+,coalesce(product_qty_type,product_size,'missing') as even_more_replacements
+,IFNULL(IFNULL(product_qty_type,product_size),'missing') as same_as_above
+FROM product;
/* 3. NULLIF
finding values in the product_size column that are "blank" strings and setting them to NULL if they are blank */
+SELECT *
+,IFNULL(product_size,'unknown') as not_both_nulls
+,NULLIF(product_size,'') as both_nulls -- two single quotes
+,coalesce(NULLIF(product_size,''),'unknown') as replaced_both
+FROM product;
/* 4. NULLIF
filtering which rows are null or blank */
+SELECT *
+,NULLIF(product_size,'') -- criteria we are filtering on
+FROM product
+WHERE NULLIF(product_size,'') IS NULL; -- how many blanks or nulls are there, in the same line
--------------------------------------------------------------------------------------------------------------------------------------------
/* MODULE 4 */
@@ -70,6 +86,24 @@ https://learn.microsoft.com/en-us/sql/t-sql/language-elements/nullif-transact-sq
/* 1. What product is the highest price per vendor */
+SELECT x.*
+,product_name
+
+FROM
+-- inner QUERY
+(
+ SELECT
+ vendor_id
+ ,product_id
+ ,original_price
+ ,ROW_NUMBER() OVER(PARTITION BY vendor_id ORDER BY original_price DESC) as price_rank
+
+ FROM vendor_inventory
+) x
+INNER JOIN product p
+ on x.product_id = p.product_id
+
+WHERE x.price_rank = 1
/* See how this varies from using max due to the group by
@@ -112,7 +146,12 @@ VALUES
(9, 165000),
(10, 100000);
+SELECT *
+,ROW_NUMBER() OVER(ORDER BY salary DESC) as [row_number]
+,RANK() OVER(ORDER BY salary DESC) as [rank]
+,DENSE_RANK() OVER(ORDER BY salary DESC) as [dense_rank]
+FROM row_rank_dense
--------------------------------------------------------------------------------------------------------------------------------------------
@@ -122,6 +161,12 @@ VALUES
/* 1. Calculate quartile, quntiles, and percentiles from vendor daily sales */
+SELECT *
+,NTILE(4) OVER (PARTITION BY vendor_name ORDER BY sales ASC) as [quartile]
+,NTILE(5) OVER (PARTITION BY vendor_name ORDER BY sales ASC) as [quintile]
+,NTILE(100) OVER (PARTITION BY vendor_name ORDER BY sales ASC) as [percentile]
+
+FROM (
-- vendor daily sales
SELECT
@@ -140,7 +185,7 @@ VALUES
GROUP BY cp.market_date, v.vendor_id
-
+) x
--------------------------------------------------------------------------------------------------------------------------------------------
/* MODULE 4 */
/* String Manipulations */
diff --git a/05_src/sql/assignment_one.drawio.png b/05_src/sql/assignment_one.drawio.png
new file mode 100644
index 000000000..9fef216ad
Binary files /dev/null and b/05_src/sql/assignment_one.drawio.png differ
diff --git a/05_src/sql/assignment_one.sql b/05_src/sql/assignment_one.sql
new file mode 100644
index 000000000..e69de29bb
diff --git a/05_src/sql/farmersmarket.db b/05_src/sql/farmersmarket.db
index cdce82204..d93f1b89a 100644
Binary files a/05_src/sql/farmersmarket.db and b/05_src/sql/farmersmarket.db differ