Find top SQL resources from global universities, cool projects, and learning materials for data analytics.
Admin: @coderfun
Useful links: heylink.me/DataAnalytics
Promotions: @love_data
Post #2287
2.78K
- ❤ 3
SQ @sqlanalyst
Showing posts older than #2288 · Back to latest
SELECT * FROM customers WHERE city = NULL;
SELECT * FROM customers WHERE city IS NULL;
SELECT * FROM customers WHERE email IS NOT NULL;
SELECT c.customer_id, c.name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.customer_id IS NULL;
SELECT COUNT(*) FROM customers;
SELECT COUNT(city) FROM customers;
SELECT COUNT(email) FROM customers;
SELECT name, COALESCE(city, 'Unknown') AS city
FROM customers;
SELECT SUM(amount) FROM orders;
SELECT COALESCE(SUM(amount), 0) FROM orders;
WHERE email IS NULL -- missing
WHERE email = '' -- empty but exists
SELECT name, amount
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT name, amount
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT name, amount
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT name, amount
FROM customers
FULL JOIN orders
ON customers.customer_id = orders.customer_id;
SELECT e.name, m.name AS manager_name
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.employee_id;
SELECT customer_id, SUM(amount)
FROM orders
WHERE amount > 5000
GROUP BY customer_id;
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 20000;
SELECT customer_id, COUNT(*)
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) >= 5;
SELECT column_name
FROM table_name
ORDER BY column_name;
SELECT name, city
FROM customers
ORDER BY name;
SELECT name, signup_date
FROM customers
ORDER BY signup_date DESC;
SELECT order_id, amount
FROM orders
ORDER BY amount DESC;
SELECT city, signup_date
FROM customers
ORDER BY city, signup_date DESC;
SELECT name, signup_date
FROM customers
ORDER BY signup_date DESC
LIMIT 5;
SELECT name, amount
FROM orders
ORDER BY amount DESC
LIMIT 10;
SELECT name, amount
FROM orders
WHERE amount > 5000
ORDER BY amount DESC
LIMIT 3;
SELECT name, city FROM customers;Output
SELECT name, city FROM customers WHERE city = 'Pune';Output
SELECT name, signup_date FROM customers WHERE signup_date >= '2024-03-01';Output
SELECT name FROM customers WHERE city = 'Pune' AND signup_date >= '2024-01-01';SELECT name FROM customers WHERE city = 'Pune' OR city = 'Mumbai';SELECT name FROM customers WHERE city IN ('Pune','Mumbai','Delhi');SELECT name FROM customers WHERE signup_date BETWEEN '2024-01-01' AND '2024-03-31';SELECT order_id, amount FROM orders WHERE amount > 5000;Output
SELECT name FROM customers WHERE city IS NULL;SELECT name FROM customers WHERE city IS NOT NULL;SELECT name FROM customers WHERE city = 'Pune' AND customer_id IN (SELECT customer_id FROM orders WHERE amount > 5000);Output
SELECT name, city FROM customers;
WITH stages AS (
SELECT user_id,
MAX(CASE WHEN event_name = 'signup' THEN 1 ELSE 0 END) AS signup,
MAX(CASE WHEN event_name = 'product_view' THEN 1 ELSE 0 END) AS view,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS purchase
FROM events
GROUP BY user_id
)
SELECT
SUM(signup) AS signups,
SUM(purchase) AS purchases,
ROUND(100.0 * SUM(purchase) / SUM(signup), 2) AS conversion_rate
FROM stages;
WITH cohort AS (
SELECT user_id, DATE_TRUNC('month', signup_date) AS cohort_month
FROM users
),
activity AS (
SELECT l.user_id, DATE_TRUNC('month', l.login_date) AS activity_month
FROM logins l
)
SELECT
c.cohort_month,
a.activity_month,
COUNT(DISTINCT a.user_id) AS active_users
FROM cohort c
JOIN activity a ON c.user_id = a.user_id
GROUP BY c.cohort_month, a.activity_month
ORDER BY c.cohort_month, a.activity_month;
WITH active_users AS (
SELECT DATE_TRUNC('month', start_date) AS month, COUNT(DISTINCT user_id) AS active_users
FROM subscriptions
GROUP BY DATE_TRUNC('month', start_date)
),
churned_users AS (
SELECT DATE_TRUNC('month', end_date) AS month, COUNT(DISTINCT user_id) AS churned_users
FROM subscriptions
WHERE end_date IS NOT NULL
GROUP BY DATE_TRUNC('month', end_date)
)
SELECT
a.month,
a.active_users,
COALESCE(c.churned_users, 0) AS churned_users,
ROUND(100.0 * COALESCE(c.churned_users, 0) / a.active_users, 2) AS churn_rate
FROM active_users a
LEFT JOIN churned_users c ON a.month = c.month
ORDER BY a.month;
SELECT activity_date, COUNT(DISTINCT user_id) AS dau
FROM user_activity
GROUP BY activity_date
ORDER BY activity_date;
SELECT
DATE_TRUNC('month', o.order_date) AS month,
u.channel,
SUM(o.amount) AS revenue
FROM orders o
JOIN users u ON o.user_id = u.user_id
GROUP BY DATE_TRUNC('month', o.order_date), u.channel
ORDER BY month, revenue DESC;
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', sale_date) AS month,
product_id,
SUM(amount) AS revenue
FROM sales
GROUP BY DATE_TRUNC('month', sale_date), product_id
),
ranked AS (
SELECT *, RANK() OVER (PARTITION BY month ORDER BY revenue DESC) AS rnk
FROM monthly_sales
)
SELECT month, product_id, revenue
FROM ranked
WHERE rnk = 1;
SELECT customer_id,2. Create an age group column for users
CASE
WHEN SUM(amount) >= 100000 THEN 'Gold'
WHEN SUM(amount) >= 50000 THEN 'Silver'
ELSE 'Bronze'
END AS customer_category
FROM orders
GROUP BY customer_id;
SELECT user_id,3. Replace NULL salary with 0
CASE
WHEN age < 18 THEN 'Below 18'
WHEN age BETWEEN 18 AND 30 THEN '18-30'
ELSE 'Above 30'
END AS age_group
FROM users;
SELECT employee_id, COALESCE(salary, 0) AS salary4. Count employees with missing email IDs
FROM employees;
SELECT COUNT(*) AS missing_email_count5. Remove extra spaces from customer names
FROM employees
WHERE email IS NULL;
SELECT customer_id, TRIM(name) AS clean_name6. Extract first 3 characters from product code
FROM customers;
SELECT product_code, SUBSTRING(product_code, 1, 3) AS product_prefix7. Standardize date format
FROM products;
SELECT CAST(order_date AS DATE) AS clean_order_date8. Mark inactive users based on last login
FROM orders;
SELECT user_id,9. Handle empty string as NULL
CASE
WHEN last_login_date < '2023-01-01' THEN 'Inactive'
ELSE 'Active'
END AS user_status
FROM users;
SELECT NULLIF(phone_number, '') AS phone_number10. Create a clean reporting column using multiple rules
FROM customers;
SELECT amount,Double Tap ♥️ For More
CASE
WHEN amount >= 10000 THEN 'High'
WHEN amount >= 5000 THEN 'Medium'
ELSE 'Low'
END AS transaction_type
FROM transactions;
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
SELECT name, department, salary
FROM employees e
WHERE salary = (
SELECT MAX(salary)
FROM employees
WHERE department = e.department
);
SELECT department
FROM (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
) t
WHERE avg_salary > 60000;
WITH dept_avg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT department
FROM dept_avg
WHERE avg_salary > 60000;
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > (
SELECT AVG(order_count)
FROM (
SELECT COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
) x
);
SELECT product_id
FROM sales
GROUP BY product_id
HAVING SUM(amount) = (
SELECT MAX(total_sales)
FROM (
SELECT SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
) t
);
WITH product_sales AS (
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT product_id
FROM product_sales
WHERE total_sales = (
SELECT MAX(total_sales)
FROM product_sales
);
WITH dept_avg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT e.name, e.salary
FROM employees e
JOIN dept_avg d ON e.department = d.department
WHERE e.salary > d.avg_salary;