Changes between Initial Version and Version 1 of Advanced Database Reports (SQL and Stored Procedures)


Ignore:
Timestamp:
08/27/25 08:51:58 (7 days ago)
Author:
221531
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Advanced Database Reports (SQL and Stored Procedures)

    v1 v1  
     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
     10FROM orders o\\
     11JOIN order_items oi ON oi.order_id = o.order_id\\
     12JOIN item i ON i.item_id = oi.item_id\\
     13JOIN item_category ic ON ic.item_id = i.item_id\\
     14JOIN category c ON c.category_id = ic.category_id\\
     15JOIN menu m ON m.item_id = i.item_id\\
     16JOIN restaurant r ON r.restaurant_id = m.restaurant_id\\
     17WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\
     18GROUP BY r.name, c.name, i.name\\
     19ORDER BY r.name, category_name, total_quantity DESC;\\
     20}}}
     21\\
     22== Monthly Restaurant Earnings vs Costs vs Net Profit
     23{{{#!td
     24SELECT 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\\
     29FROM restaurant r\\
     30LEFT JOIN earnings e ON e.restaurant_id = r.restaurant_id\\
     31LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\
     32                  AND TO_CHAR(c.date, 'YYYY-MM') = TO_CHAR(e.date, 'YYYY-MM')\\
     33WHERE e.date >= CURRENT_DATE - INTERVAL '6 months'\\
     34GROUP BY r.name, year_month\\
     35ORDER BY r.name, year_month DESC;\\
     36}}}
     37== Customer Spending Trends by Month
     38{{{#!td
     39SELECT 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\\
     43FROM app_user u\\
     44JOIN orders o ON o.user_id = u.user_id\\
     45JOIN order_items oi ON oi.order_id = o.order_id\\
     46WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\
     47GROUP BY u.user_id, customer_name, year_month\\
     48ORDER BY u.user_id, year_month DESC;\\
     49}}}
     50== Popular Categories by Orders
     51{{{#!td
     52SELECT 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\\
     56FROM category c\\
     57JOIN item_category ic ON ic.category_id = c.category_id\\
     58JOIN item i ON i.item_id = ic.item_id\\
     59JOIN order_items oi ON oi.item_id = i.item_id\\
     60JOIN orders o ON o.order_id = oi.order_id\\
     61WHERE o.order_date >= CURRENT_DATE - INTERVAL '12 months'\\
     62GROUP BY c.name, year_month\\
     63ORDER BY year_month DESC, revenue DESC;\\
     64}}}
     65== Restaurant Summary: orders, earnings, costs, employees
     66{{{#!td
     67SELECT 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\\
     75FROM restaurant r\\
     76LEFT JOIN restaurant_owners ro ON ro.restaurant_id = r.restaurant_id\\
     77LEFT JOIN delivery_assignment da ON da.deliveryfirm_id IN \\
     78    (SELECT deliveryfirm_id FROM delivery_firm) -- links delivery men to firm\\
     79LEFT 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)\\
     84LEFT JOIN earnings er ON er.restaurant_id = r.restaurant_id\\
     85LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\
     86GROUP BY r.restaurant_id, r.name;\\
     87}}}
     88== Top-Selling Items Per Restaurant
     89{{{#!td
     90SELECT 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\\
     96FROM restaurant r\\
     97JOIN menu m ON m.restaurant_id = r.restaurant_id\\
     98JOIN item i ON i.item_id = m.item_id\\
     99JOIN order_items oi ON oi.item_id = i.item_id\\
     100JOIN orders o ON o.order_id = oi.order_id\\
     101GROUP BY r.restaurant_id, r.name, i.item_id, i.name\\
     102ORDER BY r.restaurant_id, revenue DESC;\\
     103}}}
     104== Repeat vs. New Customers
     105{{{#!td
     106SELECT 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\\
     112FROM (\\
     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\\
     121GROUP BY customer_type;\\
     122}}}
     123== Delivery Firm Performance
     124{{{#!td
     125SELECT 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\\
     129FROM delivery_firm df\\
     130JOIN delivery_assignment da ON da.deliveryfirm_id = df.deliveryfirm_id\\
     131JOIN orders o ON o.user_id = da.user_id \\
     132JOIN order_items oi ON oi.order_id = o.order_id\\
     133GROUP BY df.deliveryfirm_id, df.name\\
     134ORDER BY total_orders DESC;\\
     135}}}