├── .gitattributes ├── 01.Churn Rate.sql ├── 02. Marketing Click Through Rate Analytics.sql ├── 03. Population_queries_II.sql ├── 04.Startups.sql ├── 05. population_queries.sql ├── 06. RPA_FRAUD_DETECTION.sql ├── 07. RPA-Customer-Segmentation.sql ├── 08. Davie's Burgers Subway Ad.sql ├── README.md └── _config.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.sql linguist-detectable=true 2 | *.tsql linguist-detectable=false 3 | -------------------------------------------------------------------------------- /01.Churn Rate.sql: -------------------------------------------------------------------------------- 1 | WITH months AS ( 2 | SELECT '2017-01-01' AS 'First_Day', 3 | '2017-01-31' AS 'Last_Day' 4 | UNION 5 | SELECT '2017-02-01' AS 'First_Day', 6 | '2017-02-31' AS 'Last_Day' 7 | UNION 8 | SELECT '2017-03-01' AS 'First_Day', 9 | '2017-03-31' AS 'Last_Day' 10 | ), 11 | cross_join AS ( 12 | SELECT * 13 | FROM subscriptions 14 | CROSS JOIN months 15 | ), 16 | status AS( 17 | SELECT id, 18 | First_Day AS month, 19 | CASE 20 | WHEN subscription_start < 'First Day' AND 21 | segment = 87 THEN 1 22 | ELSE 0 23 | END AS 'is_active_87', 24 | CASE 25 | WHEN subscription_start < 'First Day' AND 26 | segment = 30 THEN 1 27 | ELSE 0 28 | END AS 'is_active_30', 29 | CASE 30 | WHEN (subscription_end BETWEEN First_Day AND Last_Day) AND 31 | segment = 87 THEN 1 32 | ELSE 0 33 | END AS 'is_canceled_87', 34 | CASE 35 | WHEN (subscription_end BETWEEN First_Day AND Last_Day) AND 36 | segment = 30 THEN 1 37 | ELSE 0 38 | END AS 'is_canceled_30' 39 | FROM cross_join 40 | ), 41 | status_aggregate AS( 42 | SELECT 43 | month, 44 | SUM(is_active_87) AS sum_active_87, 45 | SUM(is_active_30) AS sum_active_30, 46 | SUM(is_canceled_87) AS sum_canceled_87, 47 | SUM(is_canceled_30) AS sum_canceled_30 48 | FROM status 49 | GROUP BY month 50 | ) 51 | SELECT 52 | month, 53 | 100.00 * sum_canceled_87 / sum_active_87 AS 'Churn Rate 87 Group', 54 | 100.00 * sum_canceled_30 / sum_active_30 AS 'Churn Rate 30 Group' 55 | FROM status_aggregate; 56 | -------------------------------------------------------------------------------- /02. Marketing Click Through Rate Analytics.sql: -------------------------------------------------------------------------------- 1 | SELECT 2 | COUNT(DISTINCT utm_campaign) AS 'Campaigns', 3 | COUNT(DISTINCT utm_source) AS 'Sources' 4 | FROM page_visits; 5 | 6 | 7 | SELECT 8 | DISTINCT page_name 9 | FROM page_visits; 10 | 11 | 12 | WITH first_touch AS ( 13 | SELECT user_id, 14 | MIN(timestamp) as first_touch_at 15 | FROM page_visits 16 | GROUP BY user_id) 17 | SELECT 18 | pv.utm_campaign, 19 | COUNT(*) AS 'Campaign First Touch CTR' 20 | FROM first_touch AS ft 21 | JOIN page_visits AS pv 22 | ON ft.user_id = pv.user_id 23 | AND ft.first_touch_at = pv.timestamp 24 | GROUP BY 25 | pv.utm_campaign 26 | ORDER BY 27 | 2 DESC; 28 | 29 | 30 | WITH last_touch AS ( 31 | SELECT user_id, 32 | MAX(timestamp) as last_touch_at 33 | FROM page_visits 34 | GROUP BY user_id) 35 | SELECT 36 | pv.utm_campaign, 37 | COUNT(*) AS 'Campaign Last Touch CTR' 38 | FROM last_touch AS lt 39 | JOIN page_visits AS pv 40 | ON lt.user_id = pv.user_id 41 | AND lt.last_touch_at = pv.timestamp 42 | GROUP BY 43 | pv.utm_campaign 44 | ORDER BY 45 | 2 DESC; 46 | 47 | 48 | SELECT 49 | COUNT(DISTINCT user_id) AS 'Purchaser' 50 | FROM page_visits 51 | WHERE page_name = '4 - purchase'; 52 | 53 | 54 | 55 | WITH last_touch AS ( 56 | SELECT user_id, 57 | MAX(timestamp) as last_touch_at 58 | FROM page_visits 59 | GROUP BY user_id) 60 | SELECT 61 | pv.utm_campaign, 62 | COUNT(*) AS 'Campaign Leading purchase CTR' 63 | FROM last_touch AS lt 64 | JOIN page_visits AS pv 65 | ON lt.user_id = pv.user_id 66 | AND lt.last_touch_at = pv.timestamp 67 | WHERE 68 | page_name = '4 - purchase' 69 | GROUP BY 70 | pv.utm_campaign 71 | ORDER BY 72 | 2 DESC; 73 | -------------------------------------------------------------------------------- /03. Population_queries_II.sql: -------------------------------------------------------------------------------- 1 | SELECT COUNT(*) AS 'From Africa' 2 | FROM countries 3 | WHERE continent = 'Africa'; 4 | 5 | SELECT SUM(population_years.population) AS 'Oceania pop. 2005' 6 | FROM countries 7 | JOIN population_years 8 | ON countries.id = population_years.country_id 9 | WHERE population_years.year = 2005 AND 10 | countries.continent = 'Oceania' 11 | GROUP BY countries.continent; 12 | 13 | SELECT AVG(population_years.population) AS 'South America AVG pop. 2003' 14 | FROM countries 15 | JOIN population_years 16 | ON countries.id = population_years.country_id 17 | WHERE population_years.year = 2003 AND 18 | countries.continent = 'South America' 19 | GROUP BY countries.continent; 20 | 21 | SELECT countries.name AS 'Country', MIN(population_years.population) AS 'Lowest pop. Country 2007' 22 | FROM countries 23 | JOIN population_years 24 | ON countries.id = population_years.country_id 25 | WHERE population_years.year = 2007; 26 | 27 | SELECT countries.name AS 'Country', ROUND(AVG(population_years.population),2) AS 'AVG Poland POP. during Covered Timeperiod' 28 | FROM countries 29 | JOIN population_years 30 | ON countries.id = population_years.country_id 31 | WHERE countries.name = 'Poland'; 32 | 33 | SELECT COUNT(*) AS 'Countries Having The In Name' 34 | FROM countries 35 | WHERE name LIKE '% The%'; 36 | 37 | SELECT countries.continent AS 'Continent', ROUND(SUM(population_years.population),2) AS 'Pop By Continent-2010' 38 | FROM countries 39 | JOIN population_years 40 | ON countries.id = population_years.country_id 41 | WHERE population_years.year = 2010 42 | GROUP BY countries.continent 43 | ORDER BY 2 DESC ; 44 | -------------------------------------------------------------------------------- /04.Startups.sql: -------------------------------------------------------------------------------- 1 | SELECT COUNT(DISTINCT(name)) AS 'Total No. of Companies' 2 | FROM startups; 3 | 4 | SELECT SUM(valuation) AS 'Total Valuation' 5 | FROM startups; 6 | 7 | SELECT MAX(raised) AS 'Highest Amount Raised' 8 | FROM startups 9 | WHERE stage = 'Seed'; 10 | 11 | SELECT MIN(founded) AS 'Oldest Founding Year' 12 | FROM startups; 13 | 14 | SELECT AVG(valuation) 15 | FROM startups; 16 | 17 | 18 | 19 | 20 | 21 | SELECT category, ROUND(AVG(valuation),2) AS 'Mean Valuation' 22 | FROM startups 23 | WHERE category IS NOT NULL 24 | GROUP BY category 25 | ORDER BY ROUND(AVG(valuation),2) DESC ; 26 | 27 | 28 | 29 | 30 | 31 | SELECT category, COUNT(name) AS 'Companies' 32 | FROM startups 33 | GROUP BY category 34 | ORDER BY COUNT(name) DESC; 35 | 36 | SELECT category, COUNT(name) AS 'Competitive Companies' 37 | FROM startups 38 | GROUP BY category 39 | HAVING COUNT(name) > 3 40 | ORDER BY COUNT(name) DESC; 41 | 42 | 43 | 44 | 45 | SELECT location, ROUND(AVG(employees), 0) AS 'Average Employee Count' 46 | FROM startups 47 | GROUP BY location 48 | ORDER BY AVG(employees) DESC; 49 | 50 | SELECT location, ROUND(AVG(employees), 0) AS 'Average Employee Count' 51 | FROM startups 52 | GROUP BY location 53 | HAVING ROUND(AVG(employees), 0) > 500 54 | ORDER BY AVG(employees) DESC; 55 | -------------------------------------------------------------------------------- /05. population_queries.sql: -------------------------------------------------------------------------------- 1 | -- This is the first query: 2 | 3 | SELECT DISTINCT year from population_years; 4 | 5 | -- Adding additional queries below: 6 | SELECT country, population 7 | FROM population_years 8 | WHERE country = 'Gabon' 9 | ORDER BY population DESC 10 | LIMIT 1; 11 | 12 | SELECT * 13 | FROM population_years 14 | WHERE year = 2005 15 | AND population IS NOT NULL 16 | ORDER BY population 17 | LIMIT 10; 18 | 19 | SELECT * 20 | FROM population_years 21 | WHERE population > 100 AND 22 | year = 2010 23 | ORDER BY population DESC; 24 | 25 | SELECT DISTINCT country 26 | FROM population_years 27 | WHERE country LIKE '%Islands%'; 28 | 29 | SELECT * 30 | FROM population_years 31 | WHERE year = 2000 AND 32 | country = 'Indonesia'; 33 | 34 | 35 | SELECT * 36 | FROM population_years 37 | WHERE year = 2010 AND 38 | country = 'Indonesia'; 39 | 40 | -------------------------------------------------------------------------------- /06. RPA_FRAUD_DETECTION.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM transaction_data 3 | LIMIT 10; 4 | 5 | SELECT full_name, email 6 | FROM transaction_data 7 | WHERE zip = 20252; 8 | 9 | 10 | SELECT full_name, email 11 | FROM transaction_data 12 | WHERE full_name LIKE '% der %' OR 13 | full_name = 'Art Vandelay'; 14 | 15 | SELECT ip_address, email 16 | FROM transaction_data 17 | WHERE ip_address LIKE '10.%'; 18 | 19 | SELECT email 20 | FROM transaction_data 21 | WHERE email LIKE '%temp_email.com'; 22 | 23 | SELECT * 24 | FROM transaction_data 25 | WHERE ip_address LIKE '120.%' AND 26 | full_name LIKE 'John%'; 27 | -------------------------------------------------------------------------------- /07. RPA-Customer-Segmentation.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM users 3 | LIMIT 20; 4 | 5 | SELECT email, birthday 6 | FROM users 7 | WHERE birthday BETWEEN '1980-01-01' AND '1989-12-31' 8 | ORDER BY birthday; 9 | 10 | SELECT email, created_at 11 | FROM users 12 | WHERE created_at < '2017-05-01' 13 | ORDER BY created_at; 14 | 15 | SELECT email 16 | FROM users 17 | WHERE test = 'bears'; 18 | 19 | SELECT email 20 | FROM users 21 | WHERE campaign LIKE 'BBB%'; 22 | 23 | SELECT email 24 | FROM users 25 | WHERE campaign LIKE '%-2'; 26 | 27 | 28 | SELECT email 29 | FROM users 30 | WHERE campaign IS NOT NULL AND 31 | test IS NOT NULL; 32 | 33 | -------------------------------------------------------------------------------- /08. Davie's Burgers Subway Ad.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM orders 3 | LIMIT 10; 4 | 5 | SELECT DISTINCT order_date 6 | FROM orders 7 | ORDER BY order_date DESC; 8 | 9 | SELECT DISTINCT special_instructions 10 | FROM orders 11 | WHERE special_instructions IS NOT NULL 12 | ORDER BY special_instructions 13 | LIMIT 20; 14 | 15 | SELECT id AS '#', special_instructions AS 'Notes' 16 | FROM orders 17 | WHERE special_instructions LIKE '%sauce%'; 18 | 19 | SELECT id AS '#', special_instructions AS 'Notes' 20 | FROM orders 21 | WHERE special_instructions LIKE '%door%'; 22 | 23 | SELECT id AS '#', special_instructions AS 'Notes' 24 | FROM orders 25 | WHERE special_instructions LIKE '%box%'; 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | # *01. Churn Rates Calculation* 9 | 10 | ## Project Goals 11 | Four months into launching Codeflix, management asks to look into subscription churn rate. It’s early on in the business and people are excited to know how the company is doing. The marketing department is particularly interested in how the churn compares between two segments of users. They provide a dataset containing subscription data for users who were acquired through two distinct channels. 12 | Codeflix requires a minimum subscription length of 31 days, so user can never start and end their subscription in the same month. 13 | - Calculation of the churn rates for the two segments over the three month period. Which segment has a lower churn rate? 14 | 15 | 👈🏻*Click Here* [![]()
![]()