Changes between Version 1 and Version 2 of AdvancedReport7
- Timestamp:
- 12/29/25 19:13:33 (5 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AdvancedReport7
v1 v2 1 ==== =Сумарни податоци за тагови1 ==== Сумарни податоци за тагови 2 2 Сумирани податоци каде редовите се месеци, а колоните се тагови, а во полината се покажуваат различни сумирани податоци: 3 -Вкупен број на трансакции3 ===== Вкупен број на трансакции 4 4 {{{#!sql 5 DO $$ 5 CREATE OR REPLACE FUNCTION get_monthly_transaction_count_by_tag() 6 RETURNS SETOF RECORD 7 LANGUAGE plpgsql 8 AS $$ 6 9 DECLARE 7 col_list TEXT; -- Листа на тагови за изведување на пивот8 dynamic_query TEXT; -- Динамичко SQL прашање10 col_list TEXT; 11 dynamic_query TEXT; 9 12 BEGIN 10 -- Чекор 1: Динамички се генерира листа на колони 11 SELECT STRING_AGG(DISTINCT format('SUM(CASE WHEN tg.tag_name = %L THEN 1 ELSE 0 END) AS %I', tag_name, tag_name), ', ') 13 SELECT STRING_AGG( 14 DISTINCT format( 15 'SUM(CASE WHEN tg.tag_name = %L THEN 1 ELSE 0 END) AS %I', 16 tag_name, tag_name 17 ), 18 ', ' 19 ) 12 20 INTO col_list 13 21 FROM tag; 14 22 15 -- Чекор 2: Се гради динамичкото прашање16 23 dynamic_query := format( 17 'SELECT 24 'SELECT 18 25 TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month, 19 26 %s 20 FROM 21 transaction t 22 JOIN 23 tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 24 JOIN 25 tag tg ON tat.tag_id = tg.tag_id 26 GROUP BY 27 transaction_month 28 ORDER BY 29 transaction_month;', 27 FROM transaction t 28 JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 29 JOIN tag tg ON tat.tag_id = tg.tag_id 30 GROUP BY transaction_month 31 ORDER BY transaction_month;', 30 32 col_list 31 33 ); 32 34 33 -- Чекор 3: Извршување на динамичкото прашање34 EXECUTE dynamic_query;35 END$$;35 RETURN QUERY EXECUTE dynamic_query; 36 END; 37 $$; 36 38 }}} 37 - Вкупно примени средства 39 40 ===== Релациона алгебра 41 - T(transaction_id, date) 42 - TAT(transaction_id, tag_id) 43 - TG(tag_id, tag_name) 44 45 JOIN на сите табели: 46 - J1 ← T ⨝,,T.transaction_id = TAT.transaction_id,, TAT 47 - J2 ← J1 ⨝,,TAT.tag_id = TG.tag_id,, TG 48 49 Групирање по месец и таг: 50 - G ← γ,,month = FORMAT(date, 'YYYY-MM'), tag_name; COUNT(transaction_id) → transaction_count,,(J2) 51 52 == 53 54 ===== Вкупно примени средства 38 55 {{{#!sql 39 DO $$ 56 CREATE OR REPLACE FUNCTION get_monthly_income_by_tag() 57 RETURNS SETOF RECORD 58 LANGUAGE plpgsql 59 AS $$ 40 60 DECLARE 41 col_list TEXT; -- Листа на тагови за изведување на пивот42 dynamic_query TEXT; -- Динамичко SQL прашање61 col_list TEXT; 62 dynamic_query TEXT; 43 63 BEGIN 44 -- Чекор 1: Динамички се генерира листа на колони 45 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), ', ') 64 SELECT STRING_AGG( 65 DISTINCT format( 66 'SUM(CASE WHEN tg.tag_name = %L THEN tb.earned_amount ELSE 0 END) AS %I', 67 tag_name, tag_name 68 ), 69 ', ' 70 ) 46 71 INTO col_list 47 72 FROM tag; 48 73 49 -- Чекор 2: Се гради динамичкото прашање50 74 dynamic_query := format( 51 'SELECT 75 'SELECT 52 76 TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month, 53 77 %s 54 FROM 55 transaction t 56 JOIN 57 transaction_breakdown tb ON t.transaction_id = tb.transaction_id 58 JOIN 59 tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 60 JOIN 61 tag tg ON tat.tag_id = tg.tag_id 62 GROUP BY 63 transaction_month 64 ORDER BY 65 transaction_month;', 78 FROM transaction t 79 JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id 80 JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 81 JOIN tag tg ON tat.tag_id = tg.tag_id 82 GROUP BY transaction_month 83 ORDER BY transaction_month;', 66 84 col_list 67 85 ); 68 86 69 -- Чекор 3: Извршување на динамичкото прашање70 EXECUTE dynamic_query;71 END$$;87 RETURN QUERY EXECUTE dynamic_query; 88 END; 89 $$; 72 90 }}} 73 - Вкупно потрошени средства 91 92 ==== Релациона алгебра 93 - T(transaction_id, date) 94 - TB(transaction_id, earned_amount) 95 - TAT(transaction_id, tag_id) 96 - TG(tag_id, tag_name) 97 98 JOIN на сите табели: 99 - J1 ← T ⨝,,T.transaction_id = TB.transaction_id,, TB 100 - J2 ← J1 ⨝,,T.transaction_id = TAT.transaction_id,, TAT 101 - J3 ← J2 ⨝,,TAT.tag_id = TG.tag_id,, TG 102 103 Групирање по месец и таг: 104 - G ← γ,,month = FORMAT(date, 'YYYY-MM'), tag_name; Σ(earned_amount) → total_income,,(J3) 105 106 == 107 108 ===== Вкупно потрошени средства 74 109 {{{#!sql 75 DO $$ 110 CREATE OR REPLACE FUNCTION get_monthly_expense_by_tag() 111 RETURNS SETOF RECORD 112 LANGUAGE plpgsql 113 AS $$ 76 114 DECLARE 77 col_list TEXT; -- Листа на тагови за изведување на пивот78 dynamic_query TEXT; -- Динамичко SQL прашање115 col_list TEXT; 116 dynamic_query TEXT; 79 117 BEGIN 80 -- Чекор 1: Динамички се генерира листа на колони 81 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), ', ') 118 SELECT STRING_AGG( 119 DISTINCT format( 120 'SUM(CASE WHEN tg.tag_name = %L THEN tb.spent_amount ELSE 0 END) AS %I', 121 tag_name, tag_name 122 ), 123 ', ' 124 ) 82 125 INTO col_list 83 126 FROM tag; 84 127 85 -- Чекор 2: Се гради динамичкото прашање86 128 dynamic_query := format( 87 'SELECT 129 'SELECT 88 130 TO_CHAR(t.date, ''YYYY-MM'') AS transaction_month, 89 131 %s 90 FROM 91 transaction t 92 JOIN 93 transaction_breakdown tb ON t.transaction_id = tb.transaction_id 94 JOIN 95 tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 96 JOIN 97 tag tg ON tat.tag_id = tg.tag_id 98 GROUP BY 99 transaction_month 100 ORDER BY 101 transaction_month;', 132 FROM transaction t 133 JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id 134 JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id 135 JOIN tag tg ON tat.tag_id = tg.tag_id 136 GROUP BY transaction_month 137 ORDER BY transaction_month;', 102 138 col_list 103 139 ); 104 140 105 -- Чекор 3: Извршување на динамичкото прашање106 EXECUTE dynamic_query;107 END$$;141 RETURN QUERY EXECUTE dynamic_query; 142 END; 143 $$; 108 144 }}} 145 146 ==== Релациона алгебра 147 - T(transaction_id, date) 148 - TB(transaction_id, spent_amount) 149 - TAT(transaction_id, tag_id) 150 - TG(tag_id, tag_name) 151 152 JOIN на сите табели: 153 - J1 ← T ⨝,,T.transaction_id = TB.transaction_id,, TB 154 - J2 ← J1 ⨝,,T.transaction_id = TAT.transaction_id,, TAT 155 - J3 ← J2 ⨝,,TAT.tag_id = TG.tag_id,, TG 156 157 Групирање по месец и таг: 158 - G ← γ,,month = FORMAT(date, 'YYYY-MM'), tag_name; Σ(spent_amount) → total_expense,,(J3)
