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