| | 657 | |
| | 658 | == |
| | 659 | |
| | 660 | [wiki:= Напредни извештаи од базата (SQL и складирани процедури) |
| | 661 | |
| | 662 | ===== Листа на трансакции кои го надминале балансот на една сметка подредени хронолошки |
| | 663 | {{{#!sql |
| | 664 | CREATE OR REPLACE FUNCTION get_transactions_exceeding_account_balance( |
| | 665 | p_account_name TEXT |
| | 666 | ) |
| | 667 | RETURNS 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 | ) |
| | 677 | LANGUAGE plpgsql |
| | 678 | AS $$ |
| | 679 | BEGIN |
| | 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; |
| | 704 | END; |
| | 705 | $$; |
| | 706 | |
| | 707 | }}} |
| | 708 | |
| | 709 | ===== Надминување на баланс на една сметка со трансакција во сегашно време |
| | 710 | {{{#!sql |
| | 711 | CREATE OR REPLACE FUNCTION get_current_account_overdrafts() |
| | 712 | RETURNS 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 | ) |
| | 722 | LANGUAGE plpgsql |
| | 723 | AS $$ |
| | 724 | BEGIN |
| | 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; |
| | 742 | END; |
| | 743 | $$; |
| | 744 | }}} |
| | 745 | |
| | 746 | ===== Листа на трансакции кои го надминале балансот на сите сметки вкупно подредени хронолошки |
| | 747 | {{{#!sql |
| | 748 | CREATE OR REPLACE FUNCTION get_transactions_exceeding_user_total_balance() |
| | 749 | RETURNS 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 | ) |
| | 758 | LANGUAGE plpgsql |
| | 759 | AS $$ |
| | 760 | BEGIN |
| | 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; |
| | 783 | END; |
| | 784 | $$; |
| | 785 | }}} |
| | 786 | |
| | 787 | ===== Надминување на вкупниот баланс на сите сметки на корисникот во сегашно време |
| | 788 | Овде ќе го собереме моменталниот баланс на сите сметки на корисникот и ќе провериме дали сумата на моменталната трансакцијата ја надминува таа вкупна вредност |
| | 789 | {{{#!sql |
| | 790 | WITH 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 | ) |
| | 800 | SELECT |
| | 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 |
| | 805 | FROM |
| | 806 | transaction_account ta |
| | 807 | JOIN user u ON ta.user_id = u.user_id |
| | 808 | JOIN transaction_breakdown tb ON ta.transaction_account_id = tb.transaction_account_id |
| | 809 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 810 | JOIN total_user_balance tub ON u.user_id = tub.user_id |
| | 811 | WHERE |
| | 812 | t.date <= CURRENT_DATE -- Само активни трансакции до денешен датум |
| | 813 | GROUP BY |
| | 814 | u.user_id, u.user_name, tub.total_balance |
| | 815 | HAVING |
| | 816 | SUM(tb.spent_amount) > tub.total_balance -- Трансакциите го надминуваат ВКУПНИОТ моментален баланс |
| | 817 | ORDER BY |
| | 818 | u.user_id; |
| | 819 | }}} |
| | 820 | |
| | 821 | ===== Сумарни приходи и расходи по месеци |
| | 822 | Сумарните приходи и расходи (состојба) во целиот систем, поделени по месеци, со цел да се видат проблематичните месеци, се пресметува вкупниот приход и расход за секој месец, а разликата меѓу нив ќе ја даде состојбата |
| | 823 | {{{#!sql |
| | 824 | CREATE OR REPLACE FUNCTION get_monthly_system_balance() |
| | 825 | RETURNS TABLE ( |
| | 826 | month TEXT, |
| | 827 | total_income NUMERIC, |
| | 828 | total_expense NUMERIC, |
| | 829 | net_balance NUMERIC |
| | 830 | ) |
| | 831 | LANGUAGE plpgsql |
| | 832 | AS $$ |
| | 833 | BEGIN |
| | 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; |
| | 844 | END; |
| | 845 | $$; |
| | 846 | }}} |
| | 847 | Проблематичен месец е месец каде што {{{net_balance}}} е негативен. Резултатите можат да се прикажат во графикон (на пример, бар график или линиски график) за подобра анализа. Може да се додаде процентуална промена меѓу месеците за да се откријат трендовите во приходите и трошоците |
| | 848 | |
| | 849 | ===== Број на трансакции што ги надминуваат приходите на сметка |
| | 850 | {{{#!sql |
| | 851 | WITH 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 | ) |
| | 867 | SELECT |
| | 868 | account_name, |
| | 869 | COUNT(transaction_id) AS transactions_exceeding_balance |
| | 870 | FROM |
| | 871 | CumulativeBalances |
| | 872 | WHERE |
| | 873 | spent_amount > calculated_balance -- Кога потрошениот износ го надминува пресметаниот баланс |
| | 874 | AND spent_amount > 0 |
| | 875 | GROUP BY |
| | 876 | account_name |
| | 877 | ORDER BY |
| | 878 | transactions_exceeding_balance DESC; |
| | 879 | }}} |
| | 880 | Ако сакаме да ги добиеме вкупните трансакции кои ги надминуваат средствата низ целиот систем, без групирање по сметки: |
| | 881 | {{{#!sql |
| | 882 | WITH 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 | ) |
| | 900 | SELECT |
| | 901 | COUNT(transaction_id) AS total_transactions_exceeding_balance |
| | 902 | FROM |
| | 903 | CumulativeTotalBalances |
| | 904 | WHERE |
| | 905 | spent_amount > calculated_total_balance -- Кога потрошениот износ го надминува кумулативниот баланс |
| | 906 | AND spent_amount > 0; |
| | 907 | }}} |
| | 908 | |
| | 909 | ===== Сумарни податоци за тагови |
| | 910 | Сумирани податоци каде редовите се месеци, а колоните се тагови, а во полината се покажуваат различни сумирани податоци: |
| | 911 | - Вкупен број на трансакции |
| | 912 | {{{#!sql |
| | 913 | DO $$ |
| | 914 | DECLARE |
| | 915 | col_list TEXT; -- Листа на тагови за изведување на пивот |
| | 916 | dynamic_query TEXT; -- Динамичко SQL прашање |
| | 917 | BEGIN |
| | 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; |
| | 943 | END $$; |
| | 944 | }}} |
| | 945 | - Вкупно примени средства |
| | 946 | {{{#!sql |
| | 947 | DO $$ |
| | 948 | DECLARE |
| | 949 | col_list TEXT; -- Листа на тагови за изведување на пивот |
| | 950 | dynamic_query TEXT; -- Динамичко SQL прашање |
| | 951 | BEGIN |
| | 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; |
| | 979 | END $$; |
| | 980 | }}} |
| | 981 | - Вкупно потрошени средства |
| | 982 | {{{#!sql |
| | 983 | DO $$ |
| | 984 | DECLARE |
| | 985 | col_list TEXT; -- Листа на тагови за изведување на пивот |
| | 986 | dynamic_query TEXT; -- Динамичко SQL прашање |
| | 987 | BEGIN |
| | 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; |
| | 1015 | END $$; |
| | 1016 | }}} |
| | 1017 | |
| | 1018 | ===== Просечно трошење во последните 3 дена за цел систем |
| | 1019 | Просечно дневно трошење за последните три дена, земајќи ги предвид сите трансакции: |
| | 1020 | {{{#!sql |
| | 1021 | SELECT |
| | 1022 | AVG(daily_spending) AS average_spending_last_3_days |
| | 1023 | FROM ( |
| | 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 |
| | 1042 | SELECT |
| | 1043 | AVG(daily_spending) AS average_spending_last_3_days |
| | 1044 | FROM ( |
| | 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 |
| | 1064 | SELECT |
| | 1065 | SUM(tb.spent_amount) AS total_spent |
| | 1066 | FROM |
| | 1067 | transaction_breakdown tb |
| | 1068 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1069 | WHERE |
| | 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 |
| | 1077 | SELECT |
| | 1078 | SUM(tb.spent_amount) AS total_spent |
| | 1079 | FROM |
| | 1080 | transaction_breakdown tb |
| | 1081 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1082 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1083 | WHERE |
| | 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 |
| | 1092 | SELECT |
| | 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 |
| | 1094 | FROM |
| | 1095 | transaction_account ta |
| | 1096 | WHERE |
| | 1097 | ta.user_id = 101; -- ID на конкретниот корисник |
| | 1098 | }}} |
| | 1099 | |
| | 1100 | ===== Долг на кредитна картичка од минатиот месец за цел систем |
| | 1101 | Вкупна сума потрошена од сметките обележани како „кредитна картичка“ за минатиот месец |
| | 1102 | {{{#!sql |
| | 1103 | SELECT |
| | 1104 | SUM(tb.spent_amount) AS credit_card_debt |
| | 1105 | FROM |
| | 1106 | transaction_breakdown tb |
| | 1107 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1108 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1109 | WHERE |
| | 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 |
| | 1118 | SELECT |
| | 1119 | SUM(tb.spent_amount) AS credit_card_debt |
| | 1120 | FROM |
| | 1121 | transaction_breakdown tb |
| | 1122 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1123 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1124 | WHERE |
| | 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 |
| | 1134 | SELECT |
| | 1135 | tg.tag_name, |
| | 1136 | DATE_TRUNC('month', t.date) AS month, |
| | 1137 | SUM(tb.spent_amount) AS total_spent |
| | 1138 | FROM |
| | 1139 | tag tg |
| | 1140 | JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id |
| | 1141 | JOIN transaction t ON tat.transaction_id = t.transaction_id |
| | 1142 | JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id |
| | 1143 | WHERE |
| | 1144 | t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS') |
| | 1145 | GROUP BY |
| | 1146 | tg.tag_name, month |
| | 1147 | ORDER BY |
| | 1148 | tg.tag_name, month; |
| | 1149 | }}} |
| | 1150 | |
| | 1151 | ===== Трендови на трошење според тагови за корисник |
| | 1152 | Сумирање на трошењата според тагови во последните 6 месеци за одреден корисник |
| | 1153 | {{{#!sql |
| | 1154 | SELECT |
| | 1155 | tg.tag_name, |
| | 1156 | DATE_TRUNC('month', t.date) AS month, |
| | 1157 | SUM(tb.spent_amount) AS total_spent |
| | 1158 | FROM |
| | 1159 | tag_assigned_to_transaction tat |
| | 1160 | JOIN transaction t ON tat.transaction_id = t.transaction_id |
| | 1161 | JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id |
| | 1162 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1163 | JOIN tag tg ON tat.tag_id = tg.tag_id |
| | 1164 | WHERE |
| | 1165 | ta.user_id = 101 -- ID на конкретниот корисник |
| | 1166 | AND t.date >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '6 MONTHS') |
| | 1167 | GROUP BY |
| | 1168 | tg.tag_name, month |
| | 1169 | ORDER BY |
| | 1170 | tg.tag_name, month; |
| | 1171 | }}} |
| | 1172 | |
| | 1173 | ===== Вкупно трошење според тагови |
| | 1174 | Вкупно трошење групирано според тагови за тековниот месец |
| | 1175 | {{{#!sql |
| | 1176 | SELECT |
| | 1177 | tg.tag_name, |
| | 1178 | SUM(tb.spent_amount) AS total_spent |
| | 1179 | FROM |
| | 1180 | tag tg |
| | 1181 | JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id |
| | 1182 | JOIN transaction t ON tat.transaction_id = t.transaction_id |
| | 1183 | JOIN transaction_breakdown tb ON t.transaction_id = tb.transaction_id |
| | 1184 | WHERE |
| | 1185 | EXTRACT(MONTH FROM t.date) = EXTRACT(MONTH FROM CURRENT_DATE) |
| | 1186 | AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE) |
| | 1187 | GROUP BY |
| | 1188 | tg.tag_name |
| | 1189 | ORDER BY |
| | 1190 | total_spent DESC; |
| | 1191 | }}} |
| | 1192 | |
| | 1193 | ===== Сметки со највисоко вкупно трошење во изминатата година |
| | 1194 | {{{#!sql |
| | 1195 | SELECT |
| | 1196 | ta.account_name, |
| | 1197 | SUM(tb.spent_amount) AS total_spent |
| | 1198 | FROM |
| | 1199 | transaction_breakdown tb |
| | 1200 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1201 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1202 | WHERE |
| | 1203 | t.date >= NOW() - INTERVAL '1 YEAR' |
| | 1204 | GROUP BY |
| | 1205 | ta.account_name |
| | 1206 | ORDER BY |
| | 1207 | total_spent DESC |
| | 1208 | LIMIT 10; |
| | 1209 | }}} |
| | 1210 | |
| | 1211 | ===== Најчести времиња за трансакции |
| | 1212 | Во кој час од денот корисниците најчесто вршат трансакции |
| | 1213 | {{{#!sql |
| | 1214 | SELECT |
| | 1215 | EXTRACT(HOUR FROM t.date) AS transaction_hour, |
| | 1216 | COUNT(*) AS transaction_count |
| | 1217 | FROM |
| | 1218 | transaction t |
| | 1219 | GROUP BY |
| | 1220 | transaction_hour |
| | 1221 | ORDER BY |
| | 1222 | transaction_count DESC; |
| | 1223 | }}} |
| | 1224 | |
| | 1225 | ===== Трансакции според тагови со највисоко трошење за цел систем |
| | 1226 | {{{#!sql |
| | 1227 | SELECT |
| | 1228 | tg.tag_name, |
| | 1229 | SUM(tb.spent_amount) AS total_spent |
| | 1230 | FROM |
| | 1231 | transaction_breakdown tb |
| | 1232 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1233 | JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id |
| | 1234 | JOIN tag tg ON tat.tag_id = tg.tag_id |
| | 1235 | GROUP BY |
| | 1236 | tg.tag_name |
| | 1237 | ORDER BY |
| | 1238 | total_spent DESC; |
| | 1239 | }}} |
| | 1240 | |
| | 1241 | ===== Трансакции според тагови со највисоко трошење за корисник |
| | 1242 | Сумирање на трошењата според тагови за одреден корисник |
| | 1243 | {{{#!sql |
| | 1244 | SELECT |
| | 1245 | tg.tag_name, |
| | 1246 | SUM(tb.spent_amount) AS total_spent |
| | 1247 | FROM |
| | 1248 | transaction_breakdown tb |
| | 1249 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1250 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1251 | JOIN tag_assigned_to_transaction tat ON t.transaction_id = tat.transaction_id |
| | 1252 | JOIN tag tg ON tat.tag_id = tg.tag_id |
| | 1253 | WHERE |
| | 1254 | ta.user_id = 101 -- ID на конкретниот корисник |
| | 1255 | GROUP BY |
| | 1256 | tg.tag_name |
| | 1257 | ORDER BY |
| | 1258 | total_spent DESC; |
| | 1259 | }}} |
| | 1260 | |
| | 1261 | ===== Годишни трендови на трансакции за цел систем |
| | 1262 | Трошења според сметки за секој квартал од тековната година |
| | 1263 | {{{#!sql |
| | 1264 | SELECT |
| | 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 |
| | 1270 | FROM |
| | 1271 | transaction_breakdown tb |
| | 1272 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1273 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1274 | WHERE |
| | 1275 | EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE) |
| | 1276 | GROUP BY |
| | 1277 | ta.account_name |
| | 1278 | ORDER BY |
| | 1279 | ta.account_name; |
| | 1280 | }}} |
| | 1281 | |
| | 1282 | ===== Годишни трендови на трансакции за корисник |
| | 1283 | Трошења по квартали за тековната година за одреден корисник |
| | 1284 | {{{#!sql |
| | 1285 | SELECT |
| | 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 |
| | 1291 | FROM |
| | 1292 | transaction_breakdown tb |
| | 1293 | JOIN transaction t ON tb.transaction_id = t.transaction_id |
| | 1294 | JOIN transaction_account ta ON tb.transaction_account_id = ta.transaction_account_id |
| | 1295 | WHERE |
| | 1296 | ta.user_id = 101 -- ID на конкретниот корисник |
| | 1297 | AND EXTRACT(YEAR FROM t.date) = EXTRACT(YEAR FROM CURRENT_DATE) |
| | 1298 | GROUP BY |
| | 1299 | ta.account_name |
| | 1300 | ORDER BY |
| | 1301 | ta.account_name; |
| | 1302 | }}} |
| | 1303 | |
| | 1304 | ===== Неактивни тагови |
| | 1305 | Идентификување тагови кои не биле користени во изминатиот месец |
| | 1306 | {{{#!sql |
| | 1307 | SELECT |
| | 1308 | tg.tag_name |
| | 1309 | FROM |
| | 1310 | tag tg |
| | 1311 | LEFT JOIN tag_assigned_to_transaction tat ON tg.tag_id = tat.tag_id |
| | 1312 | LEFT JOIN transaction t ON tat.transaction_id = t.transaction_id |
| | 1313 | WHERE |
| | 1314 | t.date IS NULL OR t.date < NOW() - INTERVAL '1 MONTH'; |
| | 1315 | }}} |
| | 1316 | |
| | 1317 | == |
| | 1318 | |
| | 1319 | [wiki:AdvancedReportsVersion1 Верзија 1] |