wiki:AdvancedReport5

Најактивни келнери според приход

Опис

Извештајот ги прикажува сите келнери со вкупниот број на нарачки, вкупниот приход и просечната вредност на нарачка.

SQL решение

CREATE OR REPLACE FUNCTION get_top_waiters()
RETURNS TABLE (
    user_id INT,
    waiter_name TEXT,
    role_name TEXT,
    total_orders BIGINT,
    total_revenue NUMERIC,
    avg_order_value NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT 
        u.user_id,
        (u.first_name || ' ' || u.last_name)::TEXT AS waiter_name,
        r.role_name::TEXT AS role_name,
        COUNT(DISTINCT o.order_id) AS total_orders,
        SUM(oi.quantity * oi.unit_price) AS total_revenue,
        ROUND(AVG(oi.quantity * oi.unit_price), 2) AS avg_order_value
    FROM project.app_user u
    JOIN project.role r ON r.role_id = u.role_id
    JOIN project.orders o ON o.user_id = u.user_id
    JOIN project.order_item oi ON oi.order_id = o.order_id
    WHERE o.status = 'ПЛАТЕНА'
    GROUP BY u.user_id, u.first_name, u.last_name, r.role_name
    ORDER BY total_revenue DESC;
END;
$$;

Релациона алгебра

U(user_id, first_name, last_name, role_id)
R(role_id, role_name)
O(order_id, user_id, status)
OI(order_id, quantity, unit_price)

J1 ← U ⨝ U.role_id = R.role_id R
J2 ← J1 ⨝ U.user_id = O.user_id O
J3 ← J2 ⨝ O.order_id = OI.order_id OI

F1 ← σ status='ПЛАТЕНА' (J3)

G ← γ user_id, waiter_name, role_name;
     COUNT(DISTINCT order_id) → total_orders,
     SUM(quantity * unit_price) → total_revenue,
     AVG(quantity * unit_price) → avg_order_value (F1)

R ← π user_id, waiter_name, role_name, total_orders, total_revenue, avg_order_value (G)

R_final ← τ total_revenue DESC (R)
Last modified 7 days ago Last modified on 09/24/26 02:08:13
Note: See TracWiki for help on using the wiki.