Changes between Initial Version and Version 1 of AdvancedReportsVersion1


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReportsVersion1

    v1 v1  
     1= Напредни извештаи од базата (SQL и складирани процедури)
     2
     3===== Листа на трансакции кои го надминале балансот на една сметка подредени хронолошки
     4{{{#!sql
     5CREATE OR REPLACE FUNCTION get_transactions_exceeding_account_balance(
     6    p_account_name TEXT
     7)
     8RETURNS TABLE (
     9    user_id INT,
     10    user_name TEXT,
     11    account_name TEXT,
     12    transaction_id INT,
     13    transaction_name TEXT,
     14    transaction_amount NUMERIC,
     15    transaction_date TIMESTAMP,
     16    calculated_balance NUMERIC
     17)
     18LANGUAGE plpgsql
     19AS $$
     20BEGIN
     21    RETURN QUERY
     22    WITH cumulative_balances AS (
     23        SELECT
     24            u.user_id,
     25            u.user_name,
     26            ta.account_name,
     27            t.transaction_id,
     28            t.transaction_name,
     29            tb.spent_amount AS transaction_amount,
     30            t.date AS transaction_date,
     31            SUM(tb.earned_amount - tb.spent_amount)
     32                OVER (PARTITION BY ta.transaction_account_id ORDER BY t.date)
     33                AS calculated_balance
     34        FROM transaction_account ta
     35        JOIN "user" u ON ta.user_id = u.user_id
     36        JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     37        JOIN transaction t ON tb.transaction_id = t.transaction_id
     38        WHERE ta.account_name = p_account_name
     39    )
     40    SELECT *
     41    FROM cumulative_balances
     42    WHERE transaction_amount > calculated_balance
     43      AND transaction_amount > 0
     44    ORDER BY transaction_date DESC;
     45END;
     46$$;
     47
     48}}}
     49
     50===== Надминување на баланс на една сметка со трансакција во сегашно време
     51{{{#!sql
     52CREATE OR REPLACE FUNCTION get_current_account_overdrafts()
     53RETURNS TABLE (
     54    user_id INT,
     55    user_name TEXT,
     56    account_name TEXT,
     57    current_balance NUMERIC,
     58    transaction_id INT,
     59    transaction_name TEXT,
     60    transaction_amount NUMERIC,
     61    transaction_date TIMESTAMP
     62)
     63LANGUAGE plpgsql
     64AS $$
     65BEGIN
     66    RETURN QUERY
     67    SELECT
     68        u.user_id,
     69        u.user_name,
     70        ta.account_name,
     71        ta.balance,
     72        t.transaction_id,
     73        t.transaction_name,
     74        tb.spent_amount,
     75        t.date
     76    FROM transaction_account ta
     77    JOIN "user" u ON ta.user_id = u.user_id
     78    JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     79    JOIN transaction t ON tb.transaction_id = t.transaction_id
     80    WHERE tb.spent_amount > ta.balance
     81      AND tb.spent_amount > 0
     82    ORDER BY t.date DESC;
     83END;
     84$$;
     85}}}
     86
     87===== Листа на трансакции кои го надминале балансот на сите сметки вкупно подредени хронолошки
     88{{{#!sql
     89CREATE OR REPLACE FUNCTION get_transactions_exceeding_user_total_balance()
     90RETURNS TABLE (
     91    user_id INT,
     92    user_name TEXT,
     93    transaction_id INT,
     94    transaction_name TEXT,
     95    transaction_amount NUMERIC,
     96    transaction_date TIMESTAMP,
     97    calculated_total_balance NUMERIC
     98)
     99LANGUAGE plpgsql
     100AS $$
     101BEGIN
     102    RETURN QUERY
     103    WITH cumulative_totals AS (
     104        SELECT
     105            u.user_id,
     106            u.user_name,
     107            t.transaction_id,
     108            t.transaction_name,
     109            tb.spent_amount AS transaction_amount,
     110            t.date AS transaction_date,
     111            SUM(tb.earned_amount - tb.spent_amount)
     112                OVER (PARTITION BY u.user_id ORDER BY t.date)
     113                AS calculated_total_balance
     114        FROM transaction_account ta
     115        JOIN "user" u ON ta.user_id = u.user_id
     116        JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     117        JOIN transaction t ON tb.transaction_id = t.transaction_id
     118    )
     119    SELECT *
     120    FROM cumulative_totals
     121    WHERE transaction_amount > calculated_total_balance
     122      AND transaction_amount > 0
     123    ORDER BY user_id, transaction_date DESC;
     124END;
     125$$;
     126}}}
     127
     128===== Надминување на вкупниот баланс на сите сметки на корисникот во сегашно време
     129Овде ќе го собереме моменталниот баланс на сите сметки на корисникот и ќе провериме дали сумата на моменталната трансакцијата ја надминува таа вкупна вредност
     130{{{#!sql
     131WITH total_user_balance AS (
     132    SELECT
     133        u.user_id,
     134        SUM(ta.balance) AS total_balance
     135    FROM
     136        transaction_account ta
     137    JOIN user u ON ta.user_id = u.user_id
     138    GROUP BY
     139        u.user_id
     140)
     141SELECT
     142    u.user_id,
     143    u.user_name,
     144    SUM(tb.spent_amount) AS total_transaction_amount,
     145    tub.total_balance AS user_total_balance
     146FROM
     147    transaction_account ta
     148JOIN user u ON ta.user_id = u.user_id
     149JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     150JOIN transaction t ON tb.transaction_id = t.transaction_id
     151JOIN total_user_balance tub ON u.user_id = tub.user_id
     152WHERE
     153    t.date <= CURRENT_DATE -- Само активни трансакции до денешен датум
     154GROUP BY
     155    u.user_id, u.user_name, tub.total_balance
     156HAVING
     157    SUM(tb.spent_amount) > tub.total_balance -- Трансакциите го надминуваат ВКУПНИОТ моментален баланс
     158ORDER BY
     159    u.user_id;
     160}}}
     161
     162===== Сумарни приходи и расходи по месеци
     163Сумарните приходи и расходи (состојба) во целиот систем, поделени по месеци, со цел да се видат проблематичните месеци, се пресметува вкупниот приход и расход за секој месец, а разликата меѓу нив ќе ја даде состојбата
     164{{{#!sql
     165CREATE OR REPLACE FUNCTION get_monthly_system_balance()
     166RETURNS TABLE (
     167    month TEXT,
     168    total_income NUMERIC,
     169    total_expense NUMERIC,
     170    net_balance NUMERIC
     171)
     172LANGUAGE plpgsql
     173AS $$
     174BEGIN
     175    RETURN QUERY
     176    SELECT
     177        TO_CHAR(t.date, 'YYYY-MM'),
     178        SUM(tb.earned_amount),
     179        SUM(tb.spent_amount),
     180        SUM(tb.earned_amount) - SUM(tb.spent_amount)
     181    FROM transaction t
     182    JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     183    GROUP BY TO_CHAR(t.date, 'YYYY-MM')
     184    ORDER BY month;
     185END;
     186$$;
     187}}}
     188Проблематичен месец е месец каде што {{{net_balance}}} е негативен. Резултатите можат да се прикажат во графикон (на пример, бар график или линиски график) за подобра анализа. Може да се додаде процентуална промена меѓу месеците за да се откријат трендовите во приходите и трошоците
     189
     190===== Број на трансакции што ги надминуваат приходите на сметка
     191{{{#!sql
     192WITH CumulativeBalances AS (
     193    SELECT
     194        t.transaction_id,
     195        ta.account_name,
     196        SUM(tb.earned_amount - tb.spent_amount) OVER (
     197            PARTITION BY ta.transaction_account_id
     198            ORDER BY t.date
     199        ) AS calculated_balance,
     200        tb.spent_amount
     201    FROM
     202        transaction_account ta
     203    JOIN
     204        transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     205    JOIN
     206        transaction t ON tb.transaction_id = t.transaction_id
     207)
     208SELECT
     209    account_name,
     210    COUNT(transaction_id) AS transactions_exceeding_balance
     211FROM
     212    CumulativeBalances
     213WHERE
     214    spent_amount > calculated_balance -- Кога потрошениот износ го надминува пресметаниот баланс
     215    AND spent_amount > 0
     216GROUP BY
     217    account_name
     218ORDER BY
     219    transactions_exceeding_balance DESC;
     220}}}
     221Ако сакаме да ги добиеме вкупните трансакции кои ги надминуваат средствата низ целиот систем, без групирање по сметки:
     222{{{#!sql
     223WITH CumulativeTotalBalances AS (
     224    SELECT
     225        t.transaction_id,
     226        u.user_id,
     227        SUM(tb.earned_amount - tb.spent_amount) OVER (
     228            PARTITION BY u.user_id
     229            ORDER BY t.date
     230        ) AS calculated_total_balance,
     231        tb.spent_amount
     232    FROM
     233        transaction_account ta
     234    JOIN
     235        user u ON ta.user_id = u.user_id
     236    JOIN
     237        transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     238    JOIN
     239        transaction t ON tb.transaction_id = t.transaction_id
     240)
     241SELECT
     242    COUNT(transaction_id) AS total_transactions_exceeding_balance
     243FROM
     244    CumulativeTotalBalances
     245WHERE
     246    spent_amount > calculated_total_balance -- Кога потрошениот износ го надминува кумулативниот баланс
     247    AND spent_amount > 0;
     248}}}
     249
     250===== Сумарни податоци за тагови
     251Сумирани податоци каде редовите се месеци, а колоните се тагови, а во полината се покажуваат различни сумирани податоци:
     252 - Вкупен број на трансакции
     253{{{#!sql
     254DO $$
     255DECLARE
     256    col_list TEXT; -- Листа на тагови за изведување на пивот
     257    dynamic_query TEXT; -- Динамичко SQL прашање
     258BEGIN
     259    -- Чекор 1: Динамички се генерира листа на колони
     260    SELECT STRING_AGG(DISTINCT format('SUM(CASE WHEN tg.tag_name = %L THEN 1 ELSE 0 END) AS %I', tag_name, tag_name), ', ')
     261    INTO col_list
     262    FROM tag;
     263
     264    -- Чекор 2: Се гради динамичкото прашање
     265    dynamic_query := format(
     266        'SELECT
     267            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     268            %s
     269        FROM
     270            transaction t
     271        JOIN
     272            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     273        JOIN
     274            tag tg ON tat.tag_id = tg.tag_id
     275        GROUP BY
     276            transaction_month
     277        ORDER BY
     278            transaction_month;',
     279        col_list
     280    );
     281
     282    -- Чекор 3: Извршување на динамичкото прашање
     283    EXECUTE dynamic_query;
     284END $$;
     285}}}
     286 - Вкупно примени средства
     287{{{#!sql
     288DO $$
     289DECLARE
     290    col_list TEXT; -- Листа на тагови за изведување на пивот
     291    dynamic_query TEXT; -- Динамичко SQL прашање
     292BEGIN
     293    -- Чекор 1: Динамички се генерира листа на колони
     294    SELECT STRING_AGG(DISTINCT format('SUM(CASE WHEN tg.tag_name = %L THEN tb.earned_amount ELSE 0 END) AS %I', tag_name, tag_name), ', ')
     295    INTO col_list
     296    FROM tag;
     297
     298    -- Чекор 2: Се гради динамичкото прашање
     299    dynamic_query := format(
     300        'SELECT
     301            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     302            %s
     303        FROM
     304            transaction t
     305        JOIN
     306            transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     307        JOIN
     308            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     309        JOIN
     310            tag tg ON tat.tag_id = tg.tag_id
     311        GROUP BY
     312            transaction_month
     313        ORDER BY
     314            transaction_month;',
     315        col_list
     316    );
     317
     318    -- Чекор 3: Извршување на динамичкото прашање
     319    EXECUTE dynamic_query;
     320END $$;
     321}}}
     322 - Вкупно потрошени средства
     323{{{#!sql
     324DO $$
     325DECLARE
     326    col_list TEXT; -- Листа на тагови за изведување на пивот
     327    dynamic_query TEXT; -- Динамичко SQL прашање
     328BEGIN
     329    -- Чекор 1: Динамички се генерира листа на колони
     330    SELECT STRING_AGG(DISTINCT format('SUM(CASE WHEN tg.tag_name = %L THEN tb.spent_amount ELSE 0 END) AS %I', tag_name, tag_name), ', ')
     331    INTO col_list
     332    FROM tag;
     333
     334    -- Чекор 2: Се гради динамичкото прашање
     335    dynamic_query := format(
     336        'SELECT
     337            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     338            %s
     339        FROM
     340            transaction t
     341        JOIN
     342            transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     343        JOIN
     344            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     345        JOIN
     346            tag tg ON tat.tag_id = tg.tag_id
     347        GROUP BY
     348            transaction_month
     349        ORDER BY
     350            transaction_month;',
     351        col_list
     352    );
     353
     354    -- Чекор 3: Извршување на динамичкото прашање
     355    EXECUTE dynamic_query;
     356END $$;
     357}}}
     358
     359===== Просечно трошење во последните 3 дена за цел систем
     360Просечно дневно трошење за последните три дена, земајќи ги предвид сите трансакции:
     361{{{#!sql
     362SELECT
     363    AVG(daily_spending) AS average_spending_last_3_days
     364FROM (
     365    SELECT
     366        t.date::date AS transaction_date,
     367        SUM(tb.spent_amount) AS daily_spending
     368    FROM
     369        transaction t
     370    JOIN
     371        transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     372    WHERE
     373        t.date >= CURRENT_DATE - INTERVAL '2 DAY'
     374        AND t.date < CURRENT_DATE + INTERVAL '1 DAY'
     375    GROUP BY
     376        t.date::date
     377) daily_totals;
     378}}}
     379
     380===== Просечно трошење во последните 3 дена за корисник
     381Просечно дневно трошење за последните 3 дена за одреден корисник:
     382{{{#!sql
     383SELECT
     384    AVG(daily_spending) AS average_spending_last_3_days
     385FROM (
     386    SELECT
     387        t.date::date AS transaction_date,
     388        SUM(tb.spent_amount) AS daily_spending
     389    FROM
     390        transaction t
     391    JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     392    JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     393    WHERE
     394        ta.user_id = 101 -- ID на конкретниот корисник
     395        AND t.date >= CURRENT_DATE - INTERVAL '2 DAY'
     396        AND t.date < CURRENT_DATE + INTERVAL '1 DAY'
     397    GROUP BY
     398        t.date::date
     399) daily_totals;
     400}}}
     401
     402===== Вкупно потрошено во тековниот месец за цел систем
     403Вкупна сума на трошоци во тековниот месец
     404{{{#!sql
     405SELECT
     406    SUM(tb.spent_amount) AS total_spent
     407FROM
     408    transaction_breakdown tb
     409JOIN transaction t ON tb.transaction_id = t.transaction_id
     410WHERE
     411    EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     412    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE);
     413}}}
     414
     415===== Вкупно потрошено во тековниот месец за корисник
     416Вкупна сума на трошоци во тековниот месец на еден корисник
     417{{{#!sql
     418SELECT
     419    SUM(tb.spent_amount) AS total_spent
     420FROM
     421    transaction_breakdown tb
     422JOIN transaction t ON tb.transaction_id = t.transaction_id
     423JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     424WHERE
     425    ta.user_id = 101 -- ID на конкретниот корисник
     426    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     427    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE);
     428}}}
     429
     430===== Дневен буџет до крајот на месецот за корисник
     431Дневен буџет базиран на вкупниот баланс на сите сметки на корисникот
     432{{{#!sql
     433SELECT
     434    SUM(ta.balance) / (DATE_PART('day', DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1 MONTH') - INTERVAL '1 DAY') - DATE_PART('day', CURRENT_DATE)) AS daily_budget
     435FROM
     436    transaction_account ta
     437WHERE
     438    ta.user_id = 101; -- ID на конкретниот корисник
     439}}}
     440
     441===== Долг на кредитна картичка од минатиот месец за цел систем
     442Вкупна сума потрошена од сметките обележани како „кредитна картичка“ за минатиот месец
     443{{{#!sql
     444SELECT
     445    SUM(tb.spent_amount) AS credit_card_debt
     446FROM
     447    transaction_breakdown tb
     448JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     449JOIN transaction t ON tb.transaction_id = t.transaction_id
     450WHERE
     451    (ta.account_name ILIKE '%кредитна%' OR ta.account_name ILIKE '%credit%')
     452    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE - INTERVAL '1 MONTH')
     453    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE - INTERVAL '1 MONTH');
     454}}}
     455
     456===== Долг на кредитна картичка од минатиот месец за корисник
     457Потрошено од сметки означени како „кредитна картичка“ за минатиот месец за еден корисник
     458{{{#!sql
     459SELECT
     460    SUM(tb.spent_amount) AS credit_card_debt
     461FROM
     462    transaction_breakdown tb
     463JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     464JOIN transaction t ON tb.transaction_id = t.transaction_id
     465WHERE
     466    ta.user_id = 101 -- ID на конкретниот корисник
     467    AND (ta.account_name ILIKE '%кредитна%' OR ta.account_name ILIKE '%credit%')
     468    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE - INTERVAL '1 MONTH')
     469    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE - INTERVAL '1 MONTH');
     470}}}
     471
     472===== Трендови на трошење според тагови за цел систем
     473Трендови на трошење за секој таг во последните шест месеци
     474{{{#!sql
     475SELECT
     476    tg.tag_name,
     477    DATE_TRUNC('month', t.date) AS month,
     478    SUM(tb.spent_amount) AS total_spent
     479FROM
     480    tag tg
     481JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     482JOIN transaction t ON tat.transaction_id = t.transaction_id
     483JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     484WHERE
     485    t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')
     486GROUP BY
     487    tg.tag_name, month
     488ORDER BY
     489    tg.tag_name, month;
     490}}}
     491
     492===== Трендови на трошење според тагови за корисник
     493Сумирање на трошењата според тагови во последните 6 месеци за одреден корисник
     494{{{#!sql
     495SELECT
     496    tg.tag_name,
     497    DATE_TRUNC('month', t.date) AS month,
     498    SUM(tb.spent_amount) AS total_spent
     499FROM
     500    tag_assigned_to_transaction tat
     501JOIN transaction t ON tat.transaction_id = t.transaction_id
     502JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     503JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     504JOIN tag tg ON tat.tag_id = tg.tag_id
     505WHERE
     506    ta.user_id = 101 -- ID на конкретниот корисник
     507    AND t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')
     508GROUP BY
     509    tg.tag_name, month
     510ORDER BY
     511    tg.tag_name, month;
     512}}}
     513
     514===== Вкупно трошење според тагови
     515Вкупно трошење групирано според тагови за тековниот месец
     516{{{#!sql
     517SELECT
     518    tg.tag_name,
     519    SUM(tb.spent_amount) AS total_spent
     520FROM
     521    tag tg
     522JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     523JOIN transaction t ON tat.transaction_id = t.transaction_id
     524JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     525WHERE
     526    EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     527    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     528GROUP BY
     529    tg.tag_name
     530ORDER BY
     531    total_spent DESC;
     532}}}
     533
     534===== Сметки со највисоко вкупно трошење во изминатата година
     535{{{#!sql
     536SELECT
     537    ta.account_name,
     538    SUM(tb.spent_amount) AS total_spent
     539FROM
     540    transaction_breakdown tb
     541JOIN transaction t ON tb.transaction_id = t.transaction_id
     542JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     543WHERE
     544    t.date >= NOW() - INTERVAL '1 YEAR'
     545GROUP BY
     546    ta.account_name
     547ORDER BY
     548    total_spent DESC
     549LIMIT 10;
     550}}}
     551
     552===== Најчести времиња за трансакции
     553Во кој час од денот корисниците најчесто вршат трансакции
     554{{{#!sql
     555SELECT
     556    EXTRACT(HOUR FROM t.date) AS transaction_hour,
     557    COUNT(*) AS transaction_count
     558FROM
     559    transaction t
     560GROUP BY
     561    transaction_hour
     562ORDER BY
     563    transaction_count DESC;
     564}}}
     565
     566===== Трансакции според тагови со највисоко трошење за цел систем
     567{{{#!sql
     568SELECT
     569    tg.tag_name,
     570    SUM(tb.spent_amount) AS total_spent
     571FROM
     572    transaction_breakdown tb
     573JOIN transaction t ON tb.transaction_id = t.transaction_id
     574JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     575JOIN tag tg ON tat.tag_id = tg.tag_id
     576GROUP BY
     577    tg.tag_name
     578ORDER BY
     579    total_spent DESC;
     580}}}
     581
     582===== Трансакции според тагови со највисоко трошење за корисник
     583Сумирање на трошењата според тагови за одреден корисник
     584{{{#!sql
     585SELECT
     586    tg.tag_name,
     587    SUM(tb.spent_amount) AS total_spent
     588FROM
     589    transaction_breakdown tb
     590JOIN transaction t ON tb.transaction_id = t.transaction_id
     591JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     592JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     593JOIN tag tg ON tat.tag_id = tg.tag_id
     594WHERE
     595    ta.user_id = 101 -- ID на конкретниот корисник
     596GROUP BY
     597    tg.tag_name
     598ORDER BY
     599    total_spent DESC;
     600}}}
     601
     602===== Годишни трендови на трансакции за цел систем
     603Трошења според сметки за секој квартал од тековната година
     604{{{#!sql
     605SELECT
     606    ta.account_name,
     607    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 1 THEN tb.spent_amount ELSE 0 END) AS q1_spent,
     608    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 2 THEN tb.spent_amount ELSE 0 END) AS q2_spent,
     609    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 3 THEN tb.spent_amount ELSE 0 END) AS q3_spent,
     610    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 4 THEN tb.spent_amount ELSE 0 END) AS q4_spent
     611FROM
     612    transaction_breakdown tb
     613JOIN transaction t ON tb.transaction_id = t.transaction_id
     614JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     615WHERE
     616    EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     617GROUP BY
     618    ta.account_name
     619ORDER BY
     620    ta.account_name;
     621}}}
     622
     623===== Годишни трендови на трансакции за корисник
     624Трошења по квартали за тековната година за одреден корисник
     625{{{#!sql
     626SELECT
     627    ta.account_name,
     628    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 1 THEN tb.spent_amount ELSE 0 END) AS q1_spent,
     629    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 2 THEN tb.spent_amount ELSE 0 END) AS q2_spent,
     630    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 3 THEN tb.spent_amount ELSE 0 END) AS q3_spent,
     631    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 4 THEN tb.spent_amount ELSE 0 END) AS q4_spent
     632FROM
     633    transaction_breakdown tb
     634JOIN transaction t ON tb.transaction_id = t.transaction_id
     635JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     636WHERE
     637    ta.user_id = 101 -- ID на конкретниот корисник
     638    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     639GROUP BY
     640    ta.account_name
     641ORDER BY
     642    ta.account_name;
     643}}}
     644
     645===== Неактивни тагови
     646Идентификување тагови кои не биле користени во изминатиот месец
     647{{{#!sql
     648SELECT
     649    tg.tag_name
     650FROM
     651    tag tg
     652LEFT JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     653LEFT JOIN transaction t ON tat.transaction_id = t.transaction_id
     654WHERE
     655    t.date IS NULL OR t.date < NOW() - INTERVAL '1 MONTH';
     656}}}