Changes between Version 7 and Version 8 of AdvancedReports


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v7 v8  
    655655    t.date IS NULL OR t.date < NOW() - INTERVAL '1 MONTH';
    656656}}}
     657
     658==
     659
     660[wiki:= Напредни извештаи од базата (SQL и складирани процедури)
     661
     662===== Листа на трансакции кои го надминале балансот на една сметка подредени хронолошки
     663{{{#!sql
     664CREATE OR REPLACE FUNCTION get_transactions_exceeding_account_balance(
     665    p_account_name TEXT
     666)
     667RETURNS TABLE (
     668    user_id INT,
     669    user_name TEXT,
     670    account_name TEXT,
     671    transaction_id INT,
     672    transaction_name TEXT,
     673    transaction_amount NUMERIC,
     674    transaction_date TIMESTAMP,
     675    calculated_balance NUMERIC
     676)
     677LANGUAGE plpgsql
     678AS $$
     679BEGIN
     680    RETURN QUERY
     681    WITH cumulative_balances AS (
     682        SELECT
     683            u.user_id,
     684            u.user_name,
     685            ta.account_name,
     686            t.transaction_id,
     687            t.transaction_name,
     688            tb.spent_amount AS transaction_amount,
     689            t.date AS transaction_date,
     690            SUM(tb.earned_amount - tb.spent_amount)
     691                OVER (PARTITION BY ta.transaction_account_id ORDER BY t.date)
     692                AS calculated_balance
     693        FROM transaction_account ta
     694        JOIN "user" u ON ta.user_id = u.user_id
     695        JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     696        JOIN transaction t ON tb.transaction_id = t.transaction_id
     697        WHERE ta.account_name = p_account_name
     698    )
     699    SELECT *
     700    FROM cumulative_balances
     701    WHERE transaction_amount > calculated_balance
     702      AND transaction_amount > 0
     703    ORDER BY transaction_date DESC;
     704END;
     705$$;
     706
     707}}}
     708
     709===== Надминување на баланс на една сметка со трансакција во сегашно време
     710{{{#!sql
     711CREATE OR REPLACE FUNCTION get_current_account_overdrafts()
     712RETURNS TABLE (
     713    user_id INT,
     714    user_name TEXT,
     715    account_name TEXT,
     716    current_balance NUMERIC,
     717    transaction_id INT,
     718    transaction_name TEXT,
     719    transaction_amount NUMERIC,
     720    transaction_date TIMESTAMP
     721)
     722LANGUAGE plpgsql
     723AS $$
     724BEGIN
     725    RETURN QUERY
     726    SELECT
     727        u.user_id,
     728        u.user_name,
     729        ta.account_name,
     730        ta.balance,
     731        t.transaction_id,
     732        t.transaction_name,
     733        tb.spent_amount,
     734        t.date
     735    FROM transaction_account ta
     736    JOIN "user" u ON ta.user_id = u.user_id
     737    JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     738    JOIN transaction t ON tb.transaction_id = t.transaction_id
     739    WHERE tb.spent_amount > ta.balance
     740      AND tb.spent_amount > 0
     741    ORDER BY t.date DESC;
     742END;
     743$$;
     744}}}
     745
     746===== Листа на трансакции кои го надминале балансот на сите сметки вкупно подредени хронолошки
     747{{{#!sql
     748CREATE OR REPLACE FUNCTION get_transactions_exceeding_user_total_balance()
     749RETURNS TABLE (
     750    user_id INT,
     751    user_name TEXT,
     752    transaction_id INT,
     753    transaction_name TEXT,
     754    transaction_amount NUMERIC,
     755    transaction_date TIMESTAMP,
     756    calculated_total_balance NUMERIC
     757)
     758LANGUAGE plpgsql
     759AS $$
     760BEGIN
     761    RETURN QUERY
     762    WITH cumulative_totals AS (
     763        SELECT
     764            u.user_id,
     765            u.user_name,
     766            t.transaction_id,
     767            t.transaction_name,
     768            tb.spent_amount AS transaction_amount,
     769            t.date AS transaction_date,
     770            SUM(tb.earned_amount - tb.spent_amount)
     771                OVER (PARTITION BY u.user_id ORDER BY t.date)
     772                AS calculated_total_balance
     773        FROM transaction_account ta
     774        JOIN "user" u ON ta.user_id = u.user_id
     775        JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     776        JOIN transaction t ON tb.transaction_id = t.transaction_id
     777    )
     778    SELECT *
     779    FROM cumulative_totals
     780    WHERE transaction_amount > calculated_total_balance
     781      AND transaction_amount > 0
     782    ORDER BY user_id, transaction_date DESC;
     783END;
     784$$;
     785}}}
     786
     787===== Надминување на вкупниот баланс на сите сметки на корисникот во сегашно време
     788Овде ќе го собереме моменталниот баланс на сите сметки на корисникот и ќе провериме дали сумата на моменталната трансакцијата ја надминува таа вкупна вредност
     789{{{#!sql
     790WITH total_user_balance AS (
     791    SELECT
     792        u.user_id,
     793        SUM(ta.balance) AS total_balance
     794    FROM
     795        transaction_account ta
     796    JOIN user u ON ta.user_id = u.user_id
     797    GROUP BY
     798        u.user_id
     799)
     800SELECT
     801    u.user_id,
     802    u.user_name,
     803    SUM(tb.spent_amount) AS total_transaction_amount,
     804    tub.total_balance AS user_total_balance
     805FROM
     806    transaction_account ta
     807JOIN user u ON ta.user_id = u.user_id
     808JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     809JOIN transaction t ON tb.transaction_id = t.transaction_id
     810JOIN total_user_balance tub ON u.user_id = tub.user_id
     811WHERE
     812    t.date <= CURRENT_DATE -- Само активни трансакции до денешен датум
     813GROUP BY
     814    u.user_id, u.user_name, tub.total_balance
     815HAVING
     816    SUM(tb.spent_amount) > tub.total_balance -- Трансакциите го надминуваат ВКУПНИОТ моментален баланс
     817ORDER BY
     818    u.user_id;
     819}}}
     820
     821===== Сумарни приходи и расходи по месеци
     822Сумарните приходи и расходи (состојба) во целиот систем, поделени по месеци, со цел да се видат проблематичните месеци, се пресметува вкупниот приход и расход за секој месец, а разликата меѓу нив ќе ја даде состојбата
     823{{{#!sql
     824CREATE OR REPLACE FUNCTION get_monthly_system_balance()
     825RETURNS TABLE (
     826    month TEXT,
     827    total_income NUMERIC,
     828    total_expense NUMERIC,
     829    net_balance NUMERIC
     830)
     831LANGUAGE plpgsql
     832AS $$
     833BEGIN
     834    RETURN QUERY
     835    SELECT
     836        TO_CHAR(t.date, 'YYYY-MM'),
     837        SUM(tb.earned_amount),
     838        SUM(tb.spent_amount),
     839        SUM(tb.earned_amount) - SUM(tb.spent_amount)
     840    FROM transaction t
     841    JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     842    GROUP BY TO_CHAR(t.date, 'YYYY-MM')
     843    ORDER BY month;
     844END;
     845$$;
     846}}}
     847Проблематичен месец е месец каде што {{{net_balance}}} е негативен. Резултатите можат да се прикажат во графикон (на пример, бар график или линиски график) за подобра анализа. Може да се додаде процентуална промена меѓу месеците за да се откријат трендовите во приходите и трошоците
     848
     849===== Број на трансакции што ги надминуваат приходите на сметка
     850{{{#!sql
     851WITH CumulativeBalances AS (
     852    SELECT
     853        t.transaction_id,
     854        ta.account_name,
     855        SUM(tb.earned_amount - tb.spent_amount) OVER (
     856            PARTITION BY ta.transaction_account_id
     857            ORDER BY t.date
     858        ) AS calculated_balance,
     859        tb.spent_amount
     860    FROM
     861        transaction_account ta
     862    JOIN
     863        transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     864    JOIN
     865        transaction t ON tb.transaction_id = t.transaction_id
     866)
     867SELECT
     868    account_name,
     869    COUNT(transaction_id) AS transactions_exceeding_balance
     870FROM
     871    CumulativeBalances
     872WHERE
     873    spent_amount > calculated_balance -- Кога потрошениот износ го надминува пресметаниот баланс
     874    AND spent_amount > 0
     875GROUP BY
     876    account_name
     877ORDER BY
     878    transactions_exceeding_balance DESC;
     879}}}
     880Ако сакаме да ги добиеме вкупните трансакции кои ги надминуваат средствата низ целиот систем, без групирање по сметки:
     881{{{#!sql
     882WITH CumulativeTotalBalances AS (
     883    SELECT
     884        t.transaction_id,
     885        u.user_id,
     886        SUM(tb.earned_amount - tb.spent_amount) OVER (
     887            PARTITION BY u.user_id
     888            ORDER BY t.date
     889        ) AS calculated_total_balance,
     890        tb.spent_amount
     891    FROM
     892        transaction_account ta
     893    JOIN
     894        user u ON ta.user_id = u.user_id
     895    JOIN
     896        transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id
     897    JOIN
     898        transaction t ON tb.transaction_id = t.transaction_id
     899)
     900SELECT
     901    COUNT(transaction_id) AS total_transactions_exceeding_balance
     902FROM
     903    CumulativeTotalBalances
     904WHERE
     905    spent_amount > calculated_total_balance -- Кога потрошениот износ го надминува кумулативниот баланс
     906    AND spent_amount > 0;
     907}}}
     908
     909===== Сумарни податоци за тагови
     910Сумирани податоци каде редовите се месеци, а колоните се тагови, а во полината се покажуваат различни сумирани податоци:
     911 - Вкупен број на трансакции
     912{{{#!sql
     913DO $$
     914DECLARE
     915    col_list TEXT; -- Листа на тагови за изведување на пивот
     916    dynamic_query TEXT; -- Динамичко SQL прашање
     917BEGIN
     918    -- Чекор 1: Динамички се генерира листа на колони
     919    SELECT STRING_AGG(DISTINCT format('SUM(CASE WHEN tg.tag_name = %L THEN 1 ELSE 0 END) AS %I', tag_name, tag_name), ', ')
     920    INTO col_list
     921    FROM tag;
     922
     923    -- Чекор 2: Се гради динамичкото прашање
     924    dynamic_query := format(
     925        'SELECT
     926            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     927            %s
     928        FROM
     929            transaction t
     930        JOIN
     931            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     932        JOIN
     933            tag tg ON tat.tag_id = tg.tag_id
     934        GROUP BY
     935            transaction_month
     936        ORDER BY
     937            transaction_month;',
     938        col_list
     939    );
     940
     941    -- Чекор 3: Извршување на динамичкото прашање
     942    EXECUTE dynamic_query;
     943END $$;
     944}}}
     945 - Вкупно примени средства
     946{{{#!sql
     947DO $$
     948DECLARE
     949    col_list TEXT; -- Листа на тагови за изведување на пивот
     950    dynamic_query TEXT; -- Динамичко SQL прашање
     951BEGIN
     952    -- Чекор 1: Динамички се генерира листа на колони
     953    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), ', ')
     954    INTO col_list
     955    FROM tag;
     956
     957    -- Чекор 2: Се гради динамичкото прашање
     958    dynamic_query := format(
     959        'SELECT
     960            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     961            %s
     962        FROM
     963            transaction t
     964        JOIN
     965            transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     966        JOIN
     967            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     968        JOIN
     969            tag tg ON tat.tag_id = tg.tag_id
     970        GROUP BY
     971            transaction_month
     972        ORDER BY
     973            transaction_month;',
     974        col_list
     975    );
     976
     977    -- Чекор 3: Извршување на динамичкото прашање
     978    EXECUTE dynamic_query;
     979END $$;
     980}}}
     981 - Вкупно потрошени средства
     982{{{#!sql
     983DO $$
     984DECLARE
     985    col_list TEXT; -- Листа на тагови за изведување на пивот
     986    dynamic_query TEXT; -- Динамичко SQL прашање
     987BEGIN
     988    -- Чекор 1: Динамички се генерира листа на колони
     989    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), ', ')
     990    INTO col_list
     991    FROM tag;
     992
     993    -- Чекор 2: Се гради динамичкото прашање
     994    dynamic_query := format(
     995        'SELECT
     996            TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month,
     997            %s
     998        FROM
     999            transaction t
     1000        JOIN
     1001            transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1002        JOIN
     1003            tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     1004        JOIN
     1005            tag tg ON tat.tag_id = tg.tag_id
     1006        GROUP BY
     1007            transaction_month
     1008        ORDER BY
     1009            transaction_month;',
     1010        col_list
     1011    );
     1012
     1013    -- Чекор 3: Извршување на динамичкото прашање
     1014    EXECUTE dynamic_query;
     1015END $$;
     1016}}}
     1017
     1018===== Просечно трошење во последните 3 дена за цел систем
     1019Просечно дневно трошење за последните три дена, земајќи ги предвид сите трансакции:
     1020{{{#!sql
     1021SELECT
     1022    AVG(daily_spending) AS average_spending_last_3_days
     1023FROM (
     1024    SELECT
     1025        t.date::date AS transaction_date,
     1026        SUM(tb.spent_amount) AS daily_spending
     1027    FROM
     1028        transaction t
     1029    JOIN
     1030        transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1031    WHERE
     1032        t.date >= CURRENT_DATE - INTERVAL '2 DAY'
     1033        AND t.date < CURRENT_DATE + INTERVAL '1 DAY'
     1034    GROUP BY
     1035        t.date::date
     1036) daily_totals;
     1037}}}
     1038
     1039===== Просечно трошење во последните 3 дена за корисник
     1040Просечно дневно трошење за последните 3 дена за одреден корисник:
     1041{{{#!sql
     1042SELECT
     1043    AVG(daily_spending) AS average_spending_last_3_days
     1044FROM (
     1045    SELECT
     1046        t.date::date AS transaction_date,
     1047        SUM(tb.spent_amount) AS daily_spending
     1048    FROM
     1049        transaction t
     1050    JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1051    JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1052    WHERE
     1053        ta.user_id = 101 -- ID на конкретниот корисник
     1054        AND t.date >= CURRENT_DATE - INTERVAL '2 DAY'
     1055        AND t.date < CURRENT_DATE + INTERVAL '1 DAY'
     1056    GROUP BY
     1057        t.date::date
     1058) daily_totals;
     1059}}}
     1060
     1061===== Вкупно потрошено во тековниот месец за цел систем
     1062Вкупна сума на трошоци во тековниот месец
     1063{{{#!sql
     1064SELECT
     1065    SUM(tb.spent_amount) AS total_spent
     1066FROM
     1067    transaction_breakdown tb
     1068JOIN transaction t ON tb.transaction_id = t.transaction_id
     1069WHERE
     1070    EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     1071    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE);
     1072}}}
     1073
     1074===== Вкупно потрошено во тековниот месец за корисник
     1075Вкупна сума на трошоци во тековниот месец на еден корисник
     1076{{{#!sql
     1077SELECT
     1078    SUM(tb.spent_amount) AS total_spent
     1079FROM
     1080    transaction_breakdown tb
     1081JOIN transaction t ON tb.transaction_id = t.transaction_id
     1082JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1083WHERE
     1084    ta.user_id = 101 -- ID на конкретниот корисник
     1085    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     1086    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE);
     1087}}}
     1088
     1089===== Дневен буџет до крајот на месецот за корисник
     1090Дневен буџет базиран на вкупниот баланс на сите сметки на корисникот
     1091{{{#!sql
     1092SELECT
     1093    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
     1094FROM
     1095    transaction_account ta
     1096WHERE
     1097    ta.user_id = 101; -- ID на конкретниот корисник
     1098}}}
     1099
     1100===== Долг на кредитна картичка од минатиот месец за цел систем
     1101Вкупна сума потрошена од сметките обележани како „кредитна картичка“ за минатиот месец
     1102{{{#!sql
     1103SELECT
     1104    SUM(tb.spent_amount) AS credit_card_debt
     1105FROM
     1106    transaction_breakdown tb
     1107JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1108JOIN transaction t ON tb.transaction_id = t.transaction_id
     1109WHERE
     1110    (ta.account_name ILIKE '%кредитна%' OR ta.account_name ILIKE '%credit%')
     1111    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE - INTERVAL '1 MONTH')
     1112    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE - INTERVAL '1 MONTH');
     1113}}}
     1114
     1115===== Долг на кредитна картичка од минатиот месец за корисник
     1116Потрошено од сметки означени како „кредитна картичка“ за минатиот месец за еден корисник
     1117{{{#!sql
     1118SELECT
     1119    SUM(tb.spent_amount) AS credit_card_debt
     1120FROM
     1121    transaction_breakdown tb
     1122JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1123JOIN transaction t ON tb.transaction_id = t.transaction_id
     1124WHERE
     1125    ta.user_id = 101 -- ID на конкретниот корисник
     1126    AND (ta.account_name ILIKE '%кредитна%' OR ta.account_name ILIKE '%credit%')
     1127    AND EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE - INTERVAL '1 MONTH')
     1128    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE - INTERVAL '1 MONTH');
     1129}}}
     1130
     1131===== Трендови на трошење според тагови за цел систем
     1132Трендови на трошење за секој таг во последните шест месеци
     1133{{{#!sql
     1134SELECT
     1135    tg.tag_name,
     1136    DATE_TRUNC('month', t.date) AS month,
     1137    SUM(tb.spent_amount) AS total_spent
     1138FROM
     1139    tag tg
     1140JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     1141JOIN transaction t ON tat.transaction_id = t.transaction_id
     1142JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1143WHERE
     1144    t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')
     1145GROUP BY
     1146    tg.tag_name, month
     1147ORDER BY
     1148    tg.tag_name, month;
     1149}}}
     1150
     1151===== Трендови на трошење според тагови за корисник
     1152Сумирање на трошењата според тагови во последните 6 месеци за одреден корисник
     1153{{{#!sql
     1154SELECT
     1155    tg.tag_name,
     1156    DATE_TRUNC('month', t.date) AS month,
     1157    SUM(tb.spent_amount) AS total_spent
     1158FROM
     1159    tag_assigned_to_transaction tat
     1160JOIN transaction t ON tat.transaction_id = t.transaction_id
     1161JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1162JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1163JOIN tag tg ON tat.tag_id = tg.tag_id
     1164WHERE
     1165    ta.user_id = 101 -- ID на конкретниот корисник
     1166    AND t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS')
     1167GROUP BY
     1168    tg.tag_name, month
     1169ORDER BY
     1170    tg.tag_name, month;
     1171}}}
     1172
     1173===== Вкупно трошење според тагови
     1174Вкупно трошење групирано според тагови за тековниот месец
     1175{{{#!sql
     1176SELECT
     1177    tg.tag_name,
     1178    SUM(tb.spent_amount) AS total_spent
     1179FROM
     1180    tag tg
     1181JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     1182JOIN transaction t ON tat.transaction_id = t.transaction_id
     1183JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id
     1184WHERE
     1185    EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE)
     1186    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     1187GROUP BY
     1188    tg.tag_name
     1189ORDER BY
     1190    total_spent DESC;
     1191}}}
     1192
     1193===== Сметки со највисоко вкупно трошење во изминатата година
     1194{{{#!sql
     1195SELECT
     1196    ta.account_name,
     1197    SUM(tb.spent_amount) AS total_spent
     1198FROM
     1199    transaction_breakdown tb
     1200JOIN transaction t ON tb.transaction_id = t.transaction_id
     1201JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1202WHERE
     1203    t.date >= NOW() - INTERVAL '1 YEAR'
     1204GROUP BY
     1205    ta.account_name
     1206ORDER BY
     1207    total_spent DESC
     1208LIMIT 10;
     1209}}}
     1210
     1211===== Најчести времиња за трансакции
     1212Во кој час од денот корисниците најчесто вршат трансакции
     1213{{{#!sql
     1214SELECT
     1215    EXTRACT(HOUR FROM t.date) AS transaction_hour,
     1216    COUNT(*) AS transaction_count
     1217FROM
     1218    transaction t
     1219GROUP BY
     1220    transaction_hour
     1221ORDER BY
     1222    transaction_count DESC;
     1223}}}
     1224
     1225===== Трансакции според тагови со највисоко трошење за цел систем
     1226{{{#!sql
     1227SELECT
     1228    tg.tag_name,
     1229    SUM(tb.spent_amount) AS total_spent
     1230FROM
     1231    transaction_breakdown tb
     1232JOIN transaction t ON tb.transaction_id = t.transaction_id
     1233JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     1234JOIN tag tg ON tat.tag_id = tg.tag_id
     1235GROUP BY
     1236    tg.tag_name
     1237ORDER BY
     1238    total_spent DESC;
     1239}}}
     1240
     1241===== Трансакции според тагови со највисоко трошење за корисник
     1242Сумирање на трошењата според тагови за одреден корисник
     1243{{{#!sql
     1244SELECT
     1245    tg.tag_name,
     1246    SUM(tb.spent_amount) AS total_spent
     1247FROM
     1248    transaction_breakdown tb
     1249JOIN transaction t ON tb.transaction_id = t.transaction_id
     1250JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1251JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id
     1252JOIN tag tg ON tat.tag_id = tg.tag_id
     1253WHERE
     1254    ta.user_id = 101 -- ID на конкретниот корисник
     1255GROUP BY
     1256    tg.tag_name
     1257ORDER BY
     1258    total_spent DESC;
     1259}}}
     1260
     1261===== Годишни трендови на трансакции за цел систем
     1262Трошења според сметки за секој квартал од тековната година
     1263{{{#!sql
     1264SELECT
     1265    ta.account_name,
     1266    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 1 THEN tb.spent_amount ELSE 0 END) AS q1_spent,
     1267    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 2 THEN tb.spent_amount ELSE 0 END) AS q2_spent,
     1268    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 3 THEN tb.spent_amount ELSE 0 END) AS q3_spent,
     1269    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 4 THEN tb.spent_amount ELSE 0 END) AS q4_spent
     1270FROM
     1271    transaction_breakdown tb
     1272JOIN transaction t ON tb.transaction_id = t.transaction_id
     1273JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1274WHERE
     1275    EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     1276GROUP BY
     1277    ta.account_name
     1278ORDER BY
     1279    ta.account_name;
     1280}}}
     1281
     1282===== Годишни трендови на трансакции за корисник
     1283Трошења по квартали за тековната година за одреден корисник
     1284{{{#!sql
     1285SELECT
     1286    ta.account_name,
     1287    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 1 THEN tb.spent_amount ELSE 0 END) AS q1_spent,
     1288    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 2 THEN tb.spent_amount ELSE 0 END) AS q2_spent,
     1289    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 3 THEN tb.spent_amount ELSE 0 END) AS q3_spent,
     1290    SUM(CASE WHEN EXTRACT(QUARTER FROM t.date) = 4 THEN tb.spent_amount ELSE 0 END) AS q4_spent
     1291FROM
     1292    transaction_breakdown tb
     1293JOIN transaction t ON tb.transaction_id = t.transaction_id
     1294JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id
     1295WHERE
     1296    ta.user_id = 101 -- ID на конкретниот корисник
     1297    AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE)
     1298GROUP BY
     1299    ta.account_name
     1300ORDER BY
     1301    ta.account_name;
     1302}}}
     1303
     1304===== Неактивни тагови
     1305Идентификување тагови кои не биле користени во изминатиот месец
     1306{{{#!sql
     1307SELECT
     1308    tg.tag_name
     1309FROM
     1310    tag tg
     1311LEFT JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id
     1312LEFT JOIN transaction t ON tat.transaction_id = t.transaction_id
     1313WHERE
     1314    t.date IS NULL OR t.date < NOW() - INTERVAL '1 MONTH';
     1315}}}
     1316
     1317==
     1318
     1319[wiki:AdvancedReportsVersion1 Верзија 1]