wiki:Прашалници со релациска алгебра

Version 8 (modified by 183175, 26 hours ago) ( diff )

--

Извештај

Неделен,Месечен,Годишен извештај

Weekly
Креираме прашалник каде велиме "за секој ден од неделата во последни 7 дена,
прикажи број нарачки и вкупен приход" :

SELECT TO_CHAR(order_date, 'Dy') AS label,
       COUNT(*) AS orders,
       SUM(total_price) AS revenue
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days'
GROUP BY label
ORDER BY MIN(order_date);


Функцијата Day(order_date) претставена со релациска алгебра
со помош на групирање (aggregation) :

γ_Day(order_date); count(*), sum(total_price)
  (σ_order_date ≥ (CURRENT_DATE - 7)
    (Orders))



Monthly
Креираме прашалник каде велиме "за секој месец, преброј ги нарачките и пресметај вкупен приход" :

SELECT TO_CHAR(order_date, 'Mon') AS label,
       COUNT(*) AS orders,
       SUM(total_price) AS revenue
FROM orders
GROUP BY label
ORDER BY MIN(order_date);


Функцијата Month(order_date) претставена со релациска алгебра
со помош на групирање (aggregation) :

γ_Month(order_date); count(*), sum(total_price)(Orders)



Yearly
Креираме прашалник каде велиме "за секоја година, прикажи колку нарачки имало и колку приход е остварено" :

SELECT EXTRACT(YEAR FROM order_date)::INT AS label,
       COUNT(*) AS orders,
       SUM(total_price) AS revenue
FROM orders
GROUP BY label
ORDER BY label;


Функцијата Year(order_date) претставена со релациска алгебра
со помош на групирање (aggregation) :

γ_Year(order_date); count(*), sum(total_price)(Orders)



Најпродавани продукти,Топ клиенти,Нови регистрации по месец

Најпродавани продукти
Креираме прашалник каде велиме "за секој продукт, пресметај колку вкупно парчиња се продадени (збир на quantity), сортирај ги и земи ги првите 5" :

SELECT 
  p.product_name AS label,
  SUM(c.quantity) AS total_sold
FROM contains c
JOIN stock s ON c.id_stock = s.id_stock
JOIN products p ON s.id_product = p.id_product
GROUP BY p.product_name
ORDER BY total_sold DESC
LIMIT 5;


Функцијата top_products претставена со релациска алгебра каде што имаме
⨝ врска : JOIN меѓу contains, stock, products
π врска : проекција на колоните што се враќаат label и total_sold
γ врска : групирање по име на продукт, собирање на количини
ρ врска : преименување во label
τ_desc(...) врска : сортирање опаѓачки

π_label, total_sold (
  τ_desc(total_sold) (
    ρ(label ← p.product_name)(
      γ_p.product_name; SUM(c.quantity) → total_sold (
        (Contains ⨝ Stock ⨝ Products)
      )
    )
  )
)



Топ клиенти
Креираме прашалник каде велиме "да се пресмета колку трошел секој клиент вкупно,
и да се сортира според таа сума,на крај да ги врати ги првите 5" :

SELECT 
  c.first_name || ' ' || c.last_name AS label,
  SUM(o.total_price) AS total_spent
FROM orders o
JOIN customers c ON o.id_customer = c.id_customer
GROUP BY c.first_name, c.last_name
ORDER BY total_spent DESC
LIMIT 5;
\\
Функцијата {{{top_clients}}} претставена со релациска алгебра, каде што имаме: \\
⨝ врска : {{{JOIN}}} меѓу {{{orders}}} и {{{customers}}} \\
γ врска : групирање по {{{first_name}}} и {{{last_name}}} и собирање на {{{SUM(total_price)}}} \\
ρ врска : преименување на комбинацијата {{{first_name || ' ' || last_name}}} во {{{label}}} \\
π врска : проекција на колоните {{{label}}} и {{{total_spent}}} \\
τ_desc(...) врска : сортирање по {{{total_spent}}} во опаѓачки редослед  \\
LIMIT 5 : се применува како пост-процес за враќање на првите 5 записи \\
\\
{{{#!sql
π_label, total_spent (
  τ_desc(total_spent) (
    ρ(label ← concat(c.first_name, ' ', c.last_name)) (
      γ_c.first_name, c.last_name; SUM(o.total_price) → total_spent (
        Orders ⨝ Customers
      )
    )
  )
)
}}}
\\
\\
'''Нови регистрации по месец''' \\
Креираме прашалник каде велиме "за секој месец, прикажи колку нови корисници се регистрирале" : \\
\\
{{{#!sql
SELECT 
  TO_CHAR(created_at, 'Mon YYYY') AS label,
  COUNT(*) AS new_users
FROM customers
GROUP BY label
ORDER BY MIN(created_at);
\\
Функцијата {{{new_users}}} претставена со релациска алгебра, каде што имаме: \\
γ врска : групирање по {{{TO_CHAR(created_at, 'Mon YYYY')}}} \\
ρ врска : преименување на изразот {{{TO_CHAR(...)}}} во {{{label}}} \\
π врска : проекција на колоните {{{label}}} и {{{new_users}}} \\
τ(...) врска : сортирање според {{{MIN(created_at)}}} порастечки (од најстаро кон најново) \\
\\
{{{#!sql
γ_MonthYear(created_at); COUNT(*) → new_users (Customers)
или
π_label, new_users (
  ρ(label ← TO_CHAR(created_at, 'Mon YYYY')) (
    γ_label; COUNT(*) → new_users (Customers)
  )
)

}}}
\\
\\
}}}
Note: See TracWiki for help on using the wiki.