wiki:AdvancedReport1

Version 1 (modified by 201178, 7 days ago) ( diff )

--

Најпрофитабилни производи во последните 12 месеци

Опис

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

SQL решение

CREATE OR REPLACE FUNCTION get_top_products_last_12_months()
RETURNS TABLE (
    product_id INT,
    product_name TEXT,
    category_name TEXT,
    total_quantity BIGINT,
    total_revenue NUMERIC,
    avg_price NUMERIC,
    order_count BIGINT
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT 
        p.product_id,
        p.name::TEXT AS product_name,
        c.name::TEXT AS category_name,
        SUM(oi.quantity) AS total_quantity,
        SUM(oi.quantity * oi.unit_price) AS total_revenue,
        ROUND(AVG(oi.unit_price), 2) AS avg_price,
        COUNT(DISTINCT o.order_id) AS order_count
    FROM project.order_item oi
    JOIN project.orders o ON o.order_id = oi.order_id
    JOIN project.product p ON p.product_id = oi.product_id
    JOIN project.category c ON c.category_id = p.category_id
    WHERE o.status = 'ПЛАТЕНА'
      AND o.created_at >= NOW() - INTERVAL '12 months'
    GROUP BY p.product_id, p.name, c.name
    ORDER BY total_revenue DESC;
END;
$$;

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

P(product_id, name, category_id)
C(category_id, name)
O(order_id, status, created_at)
OI(order_id, product_id, quantity, unit_price)

J1 ← OI ⨝ OI.order_id = O.order_id O
J2 ← J1 ⨝ OI.product_id = P.product_id P
J3 ← J2 ⨝ P.category_id = C.category_id C

F1 ← σ status='ПЛАТЕНА' ∧ created_at ≥ NOW() - INTERVAL '12 months' (J3)

G ← γ product_id, name, category_name;
     SUM(quantity) → total_quantity,
     SUM(quantity * unit_price) → total_revenue,
     AVG(unit_price) → avg_price,
     COUNT(DISTINCT order_id) → order_count (F1)

R ← π product_id, product_name, category_name, total_quantity, total_revenue, avg_price, order_count (G)

R_final ← τ total_revenue DESC (R)
Note: See TracWiki for help on using the wiki.