Changes between Version 1 and Version 2 of AdvancedReport6


Ignore:
Timestamp:
12/29/25 18:58:53 (4 days ago)
Author:
211101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReport6

    v1 v2  
    1 ===== Број на трансакции што ги надминуваат приходите на сметка
     1==== Број на трансакции што ги надминуваат приходите на сметка
    22{{{#!sql
    3 WITH CumulativeBalances AS (
    4     SELECT
    5         t.transaction_id,
    6         ta.account_name,
    7         SUM(tb.earned_amount - tb.spent_amount) OVER (
    8             PARTITION BY ta.transaction_account_id
    9             ORDER BY t.date
    10         ) AS calculated_balance,
    11         tb.spent_amount
    12     FROM
    13         transaction_account ta
    14     JOIN
    15         transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
    16     JOIN
    17         transaction t ON tb.transaction_id = t.transaction_id
     3CREATE OR REPLACE FUNCTION get_account_transaction_overdraft_counts()
     4RETURNS TABLE (
     5    account_name TEXT,
     6    transactions_exceeding_balance INT
    187)
    19 SELECT
    20     account_name,
    21     COUNT(transaction_id) AS transactions_exceeding_balance
    22 FROM
    23     CumulativeBalances
    24 WHERE
    25     spent_amount > calculated_balance -- Кога потрошениот износ го надминува пресметаниот баланс
    26     AND spent_amount > 0
    27 GROUP BY
    28     account_name
    29 ORDER BY
    30     transactions_exceeding_balance DESC;
     8LANGUAGE plpgsql
     9AS $$
     10BEGIN
     11    RETURN QUERY
     12    WITH cumulative_balances AS (
     13        SELECT
     14            ta.account_name,
     15            t.transaction_id,
     16            tb.spent_amount,
     17            SUM(tb.earned_amount - tb.spent_amount)
     18                OVER (PARTITION BY ta.transaction_account_id ORDER BY t.date)
     19                AS calculated_balance
     20        FROM transaction_account ta
     21        JOIN transaction_breakdown tb
     22            ON ta.transaction_account_id = tb.transaction_account_id
     23        JOIN transaction t
     24            ON tb.transaction_id = t.transaction_id
     25    )
     26    SELECT
     27        account_name,
     28        COUNT(transaction_id) AS transactions_exceeding_balance
     29    FROM cumulative_balances
     30    WHERE
     31        spent_amount > calculated_balance
     32        AND spent_amount > 0
     33    GROUP BY account_name
     34    ORDER BY transactions_exceeding_balance DESC;
     35END;
     36$$;
    3137}}}
    32 Ако сакаме да ги добиеме вкупните трансакции кои ги надминуваат средствата низ целиот систем, без групирање по сметки:
     38
     39==== Релациона алгебра
     40- TA(transaction_account_id, account_name)
     41- TB(transaction_id, transaction_account_id, spent_amount, earned_amount)
     42- T(transaction_id, date)
     43
     44JOIN на сите табели:
     45- J1 ← TA ⨝,,TA.transaction_account_id = TB.transaction_account_id,, TB
     46- J2 ← J1 ⨝,,TB.transaction_id = T.transaction_id,, T
     47
     48Пресметка на кумулативен баланс по сметка:
     49- CB ← γ,,account_name, transaction_id, spent_amount; Σ(earned_amount - spent_amount) OVER (PARTITION BY transaction_account_id ORDER BY date) → calculated_balance,,(J2)
     50
     51Филтрирање на трансакции што го надминуваат балансот:
     52- F ← σ,,spent_amount > calculated_balance ∧ spent_amount > 0,,(CB)
     53
     54Броење на трансакции по сметка:
     55- R ← γ,,account_name; COUNT(transaction_id) → transactions_exceeding_balance,,(F)
     56
     57Подредување по број на прекршувања:
     58- R_final ← τ,,transactions_exceeding_balance DESC,,(R)
     59
     60==
     61
     62> Ако сакаме да ги добиеме вкупните трансакции кои ги надминуваат средствата низ целиот систем, без групирање по сметки:
    3363{{{#!sql
    34 WITH CumulativeTotalBalances AS (
    35     SELECT
    36         t.transaction_id,
    37         u.user_id,
    38         SUM(tb.earned_amount - tb.spent_amount) OVER (
    39             PARTITION BY u.user_id
    40             ORDER BY t.date
    41         ) AS calculated_total_balance,
    42         tb.spent_amount
    43     FROM
    44         transaction_account ta
    45     JOIN
    46         user u ON ta.user_id = u.user_id
    47     JOIN
    48         transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
    49     JOIN
    50         transaction t ON tb.transaction_id = t.transaction_id
     64CREATE OR REPLACE FUNCTION get_total_transaction_overdraft_count()
     65RETURNS TABLE (
     66    total_transactions_exceeding_balance INT
    5167)
    52 SELECT
    53     COUNT(transaction_id) AS total_transactions_exceeding_balance
    54 FROM
    55     CumulativeTotalBalances
    56 WHERE
    57     spent_amount > calculated_total_balance -- Кога потрошениот износ го надминува кумулативниот баланс
    58     AND spent_amount > 0;
     68LANGUAGE plpgsql
     69AS $$
     70BEGIN
     71    RETURN QUERY
     72    WITH cumulative_total_balances AS (
     73        SELECT
     74            t.transaction_id,
     75            tb.spent_amount,
     76            SUM(tb.earned_amount - tb.spent_amount)
     77                OVER (PARTITION BY u.user_id ORDER BY t.date)
     78                AS calculated_total_balance
     79        FROM transaction_account ta
     80        JOIN "user" u
     81            ON ta.user_id = u.user_id
     82        JOIN transaction_breakdown tb
     83            ON ta.transaction_account_id = tb.transaction_account_id
     84        JOIN transaction t
     85            ON tb.transaction_id = t.transaction_id
     86    )
     87    SELECT
     88        COUNT(transaction_id) AS total_transactions_exceeding_balance
     89    FROM cumulative_total_balances
     90    WHERE
     91        spent_amount > calculated_total_balance
     92        AND spent_amount > 0;
     93END;
     94$$;
    5995}}}
     96
     97==== Релациона алгебра
     98- U(user_id)
     99- TA(transaction_account_id, user_id)
     100- TB(transaction_id, transaction_account_id, spent_amount, earned_amount)
     101- T(transaction_id, date)
     102
     103JOIN на сите табели:
     104- J1 ← TA ⨝,,TA.user_id = U.user_id,, U
     105- J2 ← J1 ⨝,,TA.transaction_account_id = TB.transaction_account_id,, TB
     106- J3 ← J2 ⨝,,TB.transaction_id = T.transaction_id,, T
     107
     108Пресметка на кумулативен вкупен баланс по корисник:
     109- CT ← γ,,transaction_id, spent_amount; Σ(earned_amount - spent_amount) OVER (PARTITION BY user_id ORDER BY date) → calculated_total_balance,,(J3)
     110
     111Филтрирање на трансакции што го надминуваат вкупниот баланс:
     112- F ← σ,,spent_amount > calculated_total_balance ∧ spent_amount > 0,,(CT)
     113
     114Броење на сите прекршувачки трансакции:
     115- R_final ← γ,,; COUNT(transaction_id) → total_transactions_exceeding_balance,,(F)