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


Ignore:
Timestamp:
08/28/25 22:57:12 (5 days ago)
Author:
221531
Comment:

--

Legend:

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

    v1 v2  
    22== Orders per Item–Category–Restaurant
    33{{{#!td
    4   SELECT
     4SELECT
    55    r.name AS restaurant_name,
    66    c.name AS category_name,
     
    88    SUM(oi.quantity) AS total_quantity,
    99    SUM(oi.total_price) AS total_revenue
    10 FROM orders o\\
    11 JOIN order_items oi ON oi.order_id = o.order_id\\
     10FROM ORDERS o\\
     11JOIN ORDER_ITEMS oi ON oi.order_id = o.order_id\\
    1212JOIN item i ON i.item_id = oi.item_id\\
    1313JOIN item_category ic ON ic.item_id = i.item_id\\
    1414JOIN category c ON c.category_id = ic.category_id\\
    15 JOIN menu m ON m.item_id = i.item_id\\
     15JOIN MENU_ITEM mi ON mi.item_id = i.item_id\\
     16JOIN MENU m ON m.menu_id = mi.menu_id\\
    1617JOIN restaurant r ON r.restaurant_id = m.restaurant_id\\
    17 WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\
     18WHERE o.order_status IS NOT NULL\\
     19AND o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\
    1820GROUP BY r.name, c.name, i.name\\
    1921ORDER BY r.name, category_name, total_quantity DESC;\\
     
    2224== Monthly Restaurant Earnings vs Costs vs Net Profit
    2325{{{#!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\\
     26SELECT
     27    r.name AS restaurant_name,
     28    TO_CHAR(e.date, 'YYYY-MM') AS year_month,
     29    ROUND(SUM(e.amount), 2) AS total_earnings,
     30    ROUND(COALESCE(SUM(c.amount), 0), 2) AS total_costs,
     31    ROUND(SUM(e.amount) - COALESCE(SUM(c.amount), 0), 2) AS net_profit
    2932FROM restaurant r\\
    3033LEFT JOIN earnings e ON e.restaurant_id = r.restaurant_id\\
    3134LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\
    32                   AND TO_CHAR(c.date, 'YYYY-MM') = TO_CHAR(e.date, 'YYYY-MM')\\
     35    AND TO_CHAR(c.date, 'YYYY-MM') = TO_CHAR(e.date, 'YYYY-MM')\\
    3336WHERE e.date >= CURRENT_DATE - INTERVAL '6 months'\\
    3437GROUP BY r.name, year_month\\
     
    3740== Customer Spending Trends by Month
    3841{{{#!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\\
     42SELECT
     43    u.user_id,
     44    u.first_name || ' ' || u.last_name AS customer_name,
     45    TO_CHAR(o.order_date, 'YYYY-MM') AS year_month,
     46    COUNT(DISTINCT o.order_id) AS num_orders,
     47    SUM(oi.total_price) AS total_spent
    4348FROM 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\\
     49JOIN ORDERS o ON o.user_id = u.user_id\\
     50JOIN ORDER_ITEMS oi ON oi.order_id = o.order_id\\
    4651WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 months'\\
    4752GROUP BY u.user_id, customer_name, year_month\\
     
    5055== Popular Categories by Orders
    5156{{{#!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\\
     57SELECT
     58    c.name AS category_name,
     59    TO_CHAR(o.order_date, 'YYYY-MM') AS year_month,
     60    SUM(oi.quantity) AS total_quantity,
     61    SUM(oi.total_price) AS revenue
    5662FROM category c\\
    5763JOIN item_category ic ON ic.category_id = c.category_id\\
    5864JOIN 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\\
     65JOIN ORDER_ITEMS oi ON oi.item_id = i.item_id\\
     66JOIN ORDERS o ON o.order_id = oi.order_id\\
    6167WHERE o.order_date >= CURRENT_DATE - INTERVAL '12 months'\\
    6268GROUP BY c.name, year_month\\
     
    6571== Restaurant Summary: orders, earnings, costs, employees
    6672{{{#!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\\
     73SELECT
     74    r.restaurant_id,
     75    r.name AS restaurant_name,
     76    COUNT(DISTINCT ro.user_id) + COUNT(DISTINCT da.user_id) AS num_employees,
     77    COUNT(DISTINCT o.order_id) AS total_orders,
     78    COALESCE(SUM(er.amount), 0) AS total_earnings,
     79    COALESCE(SUM(c.amount), 0) AS total_costs,
     80    COALESCE(SUM(er.amount), 0) - COALESCE(SUM(c.amount), 0) AS net_profit
    7581FROM restaurant r\\
    7682LEFT 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)\\
     83LEFT JOIN delivery_assignment da ON da.deliveryfirm_id IN (SELECT deliveryfirm_id FROM delivery_firm)\\
     84LEFT JOIN ORDERS o ON o.restaurant_id = r.restaurant_id\\
    8485LEFT JOIN earnings er ON er.restaurant_id = r.restaurant_id\\
    8586LEFT JOIN costs c ON c.restaurant_id = r.restaurant_id\\
     
    8889== Top-Selling Items Per Restaurant
    8990{{{#!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\\
     91SELECT
     92    r.restaurant_id,
     93    r.name AS restaurant_name,
     94    i.item_id,
     95    i.name AS item_name,
     96    SUM(oi.quantity) AS total_sold,
     97    SUM(oi.total_price) AS revenue
    9698FROM 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\\
     99JOIN MENU m ON m.restaurant_id = r.restaurant_id\\
     100JOIN MENU_ITEM mi ON mi.menu_id = m.menu_id\\
     101JOIN item i ON i.item_id = mi.item_id\\
     102JOIN ORDER_ITEMS oi ON oi.item_id = i.item_id\\
     103JOIN ORDERS o ON o.order_id = oi.order_id\\
    101104GROUP BY r.restaurant_id, r.name, i.item_id, i.name\\
    102105ORDER BY r.restaurant_id, revenue DESC;\\
     
    104107== Repeat vs. New Customers
    105108{{{#!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\\
     109SELECT
     110    CASE WHEN order_count = 1 THEN 'One-time Customers' ELSE 'Repeat Customers' END AS customer_type,
     111    COUNT(*) AS num_customers,
     112    SUM(total_spent) AS total_revenue
    112113FROM (\\
    113114    SELECT u.user_id,\\
     
    115116           SUM(oi.total_price) AS total_spent\\
    116117    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\\
     118    JOIN ORDERS o ON o.user_id = u.user_id\\
     119    JOIN ORDER_ITEMS oi ON oi.order_id = o.order_id\\
    119120    GROUP BY u.user_id\\
    120121) sub\\
     
    123124== Delivery Firm Performance
    124125{{{#!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\\
     126SELECT
     127    df.deliveryfirm_id,
     128    df.name AS delivery_firm,
     129    COUNT(DISTINCT o.order_id) AS total_orders,
     130    ROUND(SUM(oi.total_price),2) AS total_order_value
    129131FROM delivery_firm df\\
    130132JOIN 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\\
     133JOIN ORDERS o ON o.deliveryman_id = da.user_id\\
     134JOIN ORDER_ITEMS oi ON oi.order_id = o.order_id\\
    133135GROUP BY df.deliveryfirm_id, df.name\\
    134136ORDER BY total_orders DESC;\\
     137
    135138}}}