| | 1 | = Advanced Database Reports |
| | 2 | == Orders per Item–Category–Restaurant |
| | 3 | {{{#!td |
| | 4 | SELECT |
| | 5 | r.name AS restaurant_name, |
| | 6 | c.name AS category_name, |
| | 7 | i.name AS item_name, |
| | 8 | SUM(oi.quantity) AS total_quantity, |
| | 9 | SUM(oi.total_price) AS total_revenue |
| | 10 | FROM orders o\\ |
| | 11 | JOIN order_items oi ON oi.order_id = o.order_id\\ |
| | 12 | JOIN item i ON i.item_id = oi.item_id\\ |
| | 13 | JOIN item_category ic ON ic.item_id = i.item_id\\ |
| | 14 | JOIN category c ON c.category_id = ic.category_id\\ |
| | 15 | JOIN menu m ON m.item_id = i.item_id\\ |
| | 16 | JOIN restaurant r ON r.restaurant_id = m.restaurant_id\\ |
| | 17 | WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\ |
| | 18 | GROUP BY r.name, c.name, i.name\\ |
| | 19 | ORDER BY r.name, category_name, total_quantity DESC;\\ |
| | 20 | }}} |
| | 21 | \\ |
| | 22 | == Monthly Restaurant Earnings vs Costs vs Net Profit |
| | 23 | {{{#!td |
| | 24 | SELECT r.name AS restaurant_name, |
| | 25 | TO_CHAR(e.date, 'YYYY-MM') AS year_month,\\ |
| | 26 | ROUND(SUM(e.amount), 2) AS total_earnings,\\ |
| | 27 | ROUND(COALESCE(SUM(c.amount), 0), 2) AS total_costs,\\ |
| | 28 | ROUND(SUM(e.amount) - COALESCE(SUM(c.amount), 0), 2) AS net_profit\\ |
| | 29 | FROM restaurant r\\ |
| | 30 | LEFT JOIN earnings e ON e.restaurant_id = r.restaurant_id\\ |
| | 31 | LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\ |
| | 32 | AND TO_CHAR(c.date, 'YYYY-MM') = TO_CHAR(e.date, 'YYYY-MM')\\ |
| | 33 | WHERE e.date >= CURRENT_DATE - INTERVAL '6 months'\\ |
| | 34 | GROUP BY r.name, year_month\\ |
| | 35 | ORDER BY r.name, year_month DESC;\\ |
| | 36 | }}} |
| | 37 | == Customer Spending Trends by Month |
| | 38 | {{{#!td |
| | 39 | SELECT u.user_id, u.first_name || ' ' || u.last_name AS customer_name,\\ |
| | 40 | TO_CHAR(o.order_date, 'YYYY-MM') AS year_month,\\ |
| | 41 | COUNT(DISTINCT o.order_id) AS num_orders,\\ |
| | 42 | SUM(oi.total_price) AS total_spent\\ |
| | 43 | FROM app_user u\\ |
| | 44 | JOIN orders o ON o.user_id = u.user_id\\ |
| | 45 | JOIN order_items oi ON oi.order_id = o.order_id\\ |
| | 46 | WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\ |
| | 47 | GROUP BY u.user_id, customer_name, year_month\\ |
| | 48 | ORDER BY u.user_id, year_month DESC;\\ |
| | 49 | }}} |
| | 50 | == Popular Categories by Orders |
| | 51 | {{{#!td |
| | 52 | SELECT c.name AS category_name, |
| | 53 | TO_CHAR(o.order_date, 'YYYY-MM') AS year_month,\\ |
| | 54 | SUM(oi.quantity) AS total_quantity,\\ |
| | 55 | SUM(oi.total_price) AS revenue\\ |
| | 56 | FROM category c\\ |
| | 57 | JOIN item_category ic ON ic.category_id = c.category_id\\ |
| | 58 | JOIN item i ON i.item_id = ic.item_id\\ |
| | 59 | JOIN order_items oi ON oi.item_id = i.item_id\\ |
| | 60 | JOIN orders o ON o.order_id = oi.order_id\\ |
| | 61 | WHERE o.order_date >= CURRENT_DATE - INTERVAL '12 months'\\ |
| | 62 | GROUP BY c.name, year_month\\ |
| | 63 | ORDER BY year_month DESC, revenue DESC;\\ |
| | 64 | }}} |
| | 65 | == Restaurant Summary: orders, earnings, costs, employees |
| | 66 | {{{#!td |
| | 67 | SELECT r.restaurant_id, |
| | 68 | r.name AS restaurant_name,\\ |
| | 69 | COUNT(DISTINCT ro.user_id) \\ |
| | 70 | + COUNT(DISTINCT da.user_id) AS num_employees,\\ |
| | 71 | COUNT(DISTINCT o.order_id) AS total_orders,\\ |
| | 72 | COALESCE(SUM(er.amount), 0) AS total_earnings,\\ |
| | 73 | COALESCE(SUM(c.amount), 0) AS total_costs,\\ |
| | 74 | COALESCE(SUM(er.amount), 0) - COALESCE(SUM(c.amount), 0) AS net_profit\\ |
| | 75 | FROM restaurant r\\ |
| | 76 | LEFT JOIN restaurant_owners ro ON ro.restaurant_id = r.restaurant_id\\ |
| | 77 | LEFT JOIN delivery_assignment da ON da.deliveryfirm_id IN \\ |
| | 78 | (SELECT deliveryfirm_id FROM delivery_firm) -- links delivery men to firm\\ |
| | 79 | LEFT JOIN orders o ON o.user_id IS NOT NULL AND o.address_id IS NOT NULL\\ |
| | 80 | AND o.order_id IN (SELECT order_id FROM order_items) -- ensures valid orders\\ |
| | 81 | AND r.restaurant_id IN (SELECT restaurant_id \\ |
| | 82 | FROM menu m \\ |
| | 83 | JOIN item i ON i.item_id = m.item_id)\\ |
| | 84 | LEFT JOIN earnings er ON er.restaurant_id = r.restaurant_id\\ |
| | 85 | LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\ |
| | 86 | GROUP BY r.restaurant_id, r.name;\\ |
| | 87 | }}} |
| | 88 | == Top-Selling Items Per Restaurant |
| | 89 | {{{#!td |
| | 90 | SELECT r.restaurant_id, |
| | 91 | r.name AS restaurant_name,\\ |
| | 92 | i.item_id,\\ |
| | 93 | i.name AS item_name,\\ |
| | 94 | SUM(oi.quantity) AS total_sold,\\ |
| | 95 | SUM(oi.total_price) AS revenue\\ |
| | 96 | FROM restaurant r\\ |
| | 97 | JOIN menu m ON m.restaurant_id = r.restaurant_id\\ |
| | 98 | JOIN item i ON i.item_id = m.item_id\\ |
| | 99 | JOIN order_items oi ON oi.item_id = i.item_id\\ |
| | 100 | JOIN orders o ON o.order_id = oi.order_id\\ |
| | 101 | GROUP BY r.restaurant_id, r.name, i.item_id, i.name\\ |
| | 102 | ORDER BY r.restaurant_id, revenue DESC;\\ |
| | 103 | }}} |
| | 104 | == Repeat vs. New Customers |
| | 105 | {{{#!td |
| | 106 | SELECT CASE |
| | 107 | WHEN order_count = 1 THEN 'One-time Customers'\\ |
| | 108 | ELSE 'Repeat Customers'\\ |
| | 109 | END AS customer_type,\\ |
| | 110 | COUNT(*) AS num_customers,\\ |
| | 111 | SUM(total_spent) AS total_revenue\\ |
| | 112 | FROM (\\ |
| | 113 | SELECT u.user_id,\\ |
| | 114 | COUNT(o.order_id) AS order_count,\\ |
| | 115 | SUM(oi.total_price) AS total_spent\\ |
| | 116 | FROM app_user u\\ |
| | 117 | JOIN orders o ON o.user_id = u.user_id\\ |
| | 118 | JOIN order_items oi ON oi.order_id = o.order_id\\ |
| | 119 | GROUP BY u.user_id\\ |
| | 120 | ) sub\\ |
| | 121 | GROUP BY customer_type;\\ |
| | 122 | }}} |
| | 123 | == Delivery Firm Performance |
| | 124 | {{{#!td |
| | 125 | SELECT df.deliveryfirm_id, |
| | 126 | df.name AS delivery_firm,\\ |
| | 127 | COUNT(DISTINCT o.order_id) AS total_orders,\\ |
| | 128 | ROUND(SUM(oi.total_price),2) AS total_order_value\\ |
| | 129 | FROM delivery_firm df\\ |
| | 130 | JOIN delivery_assignment da ON da.deliveryfirm_id = df.deliveryfirm_id\\ |
| | 131 | JOIN orders o ON o.user_id = da.user_id \\ |
| | 132 | JOIN order_items oi ON oi.order_id = o.order_id\\ |
| | 133 | GROUP BY df.deliveryfirm_id, df.name\\ |
| | 134 | ORDER BY total_orders DESC;\\ |
| | 135 | }}} |