From 07b8185c3514072166b373fd4932d2a5bae3421b Mon Sep 17 00:00:00 2001 From: Peter Wood Date: Thu, 6 Mar 2025 08:26:39 -0500 Subject: [PATCH] refactor SQL scripts for consistency and style improvements --- postgres/create uuid-ossp extension.sql | 2 +- postgres/functions/get_account_id.sql | 21 +-- .../functions/get_transactions_for_period.sql | 43 +++--- .../procedures/import_budget_from_csv.sql | 19 +-- .../procedures/update_budget_from_import.sql | 26 ++-- postgres/tables/accounts.sql | 43 +++--- postgres/tables/budgetdetails.sql | 28 ++-- postgres/tables/budgetimport.sql | 16 ++- postgres/temp.sql | 125 ++++++++++-------- postgres/views/runbal.sql | 37 +++--- 10 files changed, 192 insertions(+), 168 deletions(-) diff --git a/postgres/create uuid-ossp extension.sql b/postgres/create uuid-ossp extension.sql index 682131d..9af8fa6 100644 --- a/postgres/create uuid-ossp extension.sql +++ b/postgres/create uuid-ossp extension.sql @@ -1 +1 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; \ No newline at end of file +create extension IF not exists "uuid-ossp"; \ No newline at end of file diff --git a/postgres/functions/get_account_id.sql b/postgres/functions/get_account_id.sql index 6aadcf6..6ef2c19 100644 --- a/postgres/functions/get_account_id.sql +++ b/postgres/functions/get_account_id.sql @@ -1,17 +1,15 @@ drop function if exists public.get_account_id; -create or replace function public.get_account_id( - p_bank_name varchar - , p_bank_account_number varchar -) -returns int -LANGUAGE plpgsql -AS $$ +create +or replace function public.get_account_id ( + p_bank_name varchar, + p_bank_account_number varchar +) returns int LANGUAGE plpgsql as $$ declare _account_id int; begin - + raise notice 'FUNCTION: get_account_id'; -- E'\n' is new line raise notice 'INPUT: % p_bank_name = %; % p_bank_account_number = %;', E'\n', p_bank_name, E'\n', p_bank_account_number; @@ -30,5 +28,8 @@ return _account_id; end; $$; -GRANT EXECUTE ON function public.get_account_id(varchar, varchar) TO acedanger; -GRANT EXECUTE ON function public.get_account_id(varchar, varchar) TO budgetuser; +grant +execute on function public.get_account_id (varchar, varchar) to acedanger; + +grant +execute on function public.get_account_id (varchar, varchar) to budgetuser; \ No newline at end of file diff --git a/postgres/functions/get_transactions_for_period.sql b/postgres/functions/get_transactions_for_period.sql index 9ca347e..94173c3 100644 --- a/postgres/functions/get_transactions_for_period.sql +++ b/postgres/functions/get_transactions_for_period.sql @@ -1,31 +1,25 @@ drop function if exists public.get_transactions_for_period; -create or replace function public.get_transactions_for_period( - p_account_name text - , p_start date - , p_end date -) -returns table ( - bank_name text - , account_type text - , account_number text - , account_friendly_name text - , transaction_date date - , transaction_description text - , transaction_amount numeric(8,2) - , transaction_day_of_week text - , running_bal numeric -) -LANGUAGE plpgsql -AS $$ +create +or replace function public.get_transactions_for_period (p_account_name text, p_start date, p_end date) returns table ( + bank_name text, + account_type text, + account_number text, + account_friendly_name text, + transaction_date date, + transaction_description text, + transaction_amount numeric(8, 2), + transaction_day_of_week text, + running_bal numeric +) LANGUAGE plpgsql as $$ begin - + raise notice 'FUNCTION: get_transactions'; -- E'\n' is new line raise notice 'INPUT: % p_start = %; % p_end = %;', E'\n', p_start, E'\n', p_end; -return query - select +return query + select bl.account_bank_name, bl.account_type, bl.account_number, bl.account_friendly_name , bl.transaction_date, bl.transaction_description, bl.transaction_amount , bl.transaction_day_of_week, bl.running_bal @@ -36,5 +30,8 @@ return query end; $$; -GRANT EXECUTE ON function public.get_transactions_for_period(text, date, date) TO acedanger; -GRANT EXECUTE ON function public.get_transactions_for_period(text, date, date) TO budgetuser; +grant +execute on function public.get_transactions_for_period (text, date, date) to acedanger; + +grant +execute on function public.get_transactions_for_period (text, date, date) to budgetuser; \ No newline at end of file diff --git a/postgres/procedures/import_budget_from_csv.sql b/postgres/procedures/import_budget_from_csv.sql index 5a8c3c9..3c76950 100644 --- a/postgres/procedures/import_budget_from_csv.sql +++ b/postgres/procedures/import_budget_from_csv.sql @@ -1,10 +1,8 @@ - -create or replace procedure public.import_transactions_from_csv( - p_bank_name varchar - , p_bank_account_number varchar -) -language plpgsql -as $$ +create +or replace procedure public.import_transactions_from_csv ( + p_bank_name varchar, + p_bank_account_number varchar +) language plpgsql as $$ declare _acct int; @@ -41,5 +39,8 @@ where coalesce(amount, 0) <> 0; end $$; -GRANT EXECUTE ON PROCEDURE public.import_transactions_from_csv(varchar, varchar) TO acedanger; -GRANT EXECUTE ON PROCEDURE public.import_transactions_from_csv(varchar, varchar) TO budgetuser; +grant +execute on PROCEDURE public.import_transactions_from_csv (varchar, varchar) to acedanger; + +grant +execute on PROCEDURE public.import_transactions_from_csv (varchar, varchar) to budgetuser; \ No newline at end of file diff --git a/postgres/procedures/update_budget_from_import.sql b/postgres/procedures/update_budget_from_import.sql index d07cee8..f116d14 100644 --- a/postgres/procedures/update_budget_from_import.sql +++ b/postgres/procedures/update_budget_from_import.sql @@ -1,26 +1,25 @@ -CREATE OR REPLACE PROCEDURE public.update_budget_from_import( - p_bank_name varchar - , p_bank_account_number varchar -) - LANGUAGE plpgsql -AS $$ +create +or replace PROCEDURE public.update_budget_from_import ( + p_bank_name varchar, + p_bank_account_number varchar +) LANGUAGE plpgsql as $$ declare _acct int; -begin +begin raise notice 'PROC: update_budget_from_import'; raise notice 'INPUT: % p_bank_name = %; % p_bank_account_number = %;', E'\n', p_bank_name, E'\n', p_bank_account_number; - + _acct := public.get_account_id(p_bank_name, p_bank_account_number); - + if _acct is null then raise notice 'could not get the account id'; end if; truncate public.budgetdetails; insert into public.budgetdetails (trx_description, trx_date, trx_amount, acct_id) -select +select description , cast(dt as date) as dt_converted , amount @@ -30,5 +29,8 @@ from public.budgetimport; end $$; -GRANT EXECUTE ON PROCEDURE public.update_budget_from_import(varchar, varchar) TO acedanger; -GRANT EXECUTE ON PROCEDURE public.update_budget_from_import(varchar, varchar) TO budgetuser; +grant +execute on PROCEDURE public.update_budget_from_import (varchar, varchar) to acedanger; + +grant +execute on PROCEDURE public.update_budget_from_import (varchar, varchar) to budgetuser; \ No newline at end of file diff --git a/postgres/tables/accounts.sql b/postgres/tables/accounts.sql index c9e660c..e64f6ba 100644 --- a/postgres/tables/accounts.sql +++ b/postgres/tables/accounts.sql @@ -1,25 +1,38 @@ drop table if exists public.accounts cascade; -CREATE TABLE public.accounts( - acct_id serial, - acct_bank_name varchar(50) not null, - acct_type varchar(50) not null, - acct_number varchar(20) null, - acct_friendly_name varchar(50) null, - insert_dt_tm timestamp null default now(), - PRIMARY KEY( acct_id ) +create table public.accounts ( + acct_id serial, + acct_bank_name varchar(50) not null, + acct_type varchar(50) not null, + acct_number varchar(20) null, + acct_friendly_name varchar(50) null, + created_at timestamp null default now(), + primary key (acct_id) ); -- Permissions +alter table public.accounts OWNER to acedanger; -ALTER TABLE public.accounts OWNER TO acedanger; -GRANT ALL ON TABLE public.accounts TO acedanger; -GRANT ALL ON TABLE public.accounts TO budgetuser; +grant all on table public.accounts to acedanger; + +grant all on table public.accounts to budgetuser; -- Populate table truncate public.accounts; -INSERT INTO public.accounts (bank_name, account_type, friendly_name, account_number) values -('Bank of America', 'Checking', 'Joint Checking', '4581') -, ('Ally', 'Savings', 'Joint Savings', '9969') -, ('Ally', 'Savings', 'Vacation Savings', '6268') +insert into + public.accounts ( + bank_name, + account_type, + friendly_name, + account_number + ) +values + ( + 'Bank of America', + 'Checking', + 'Joint Checking', + '4581' + ), + ('Ally', 'Savings', 'Joint Savings', '9969'), + ('Ally', 'Savings', 'Vacation Savings', '6268') \ No newline at end of file diff --git a/postgres/tables/budgetdetails.sql b/postgres/tables/budgetdetails.sql index 8d500df..511c544 100644 --- a/postgres/tables/budgetdetails.sql +++ b/postgres/tables/budgetdetails.sql @@ -1,21 +1,19 @@ -- public.budgetdetails definition --- Drop table -DROP table if exists public.budgetdetails cascade; +drop table if exists public.budgetdetails cascade; -CREATE TABLE public.budgetdetails ( - trx_id uuid NOT NULL DEFAULT uuid_generate_v4(), - trx_description text NOT NULL, - trx_date date NOT NULL, - trx_amount numeric NOT NULL, - acct_id int NULL, - insert_dt_tm timestamp NULL DEFAULT now(), - primary key ( trx_id ), - constraint fk_acct foreign key ( acct_id ) references public.accounts(acct_id) on delete set null +create table public.budgetdetails ( + trx_id uuid not null default uuid_generate_v4 (), + trx_description text not null, + trx_date date not null, + trx_amount numeric not null, + acct_id int null, + created_at timestamp null default now(), + primary key (trx_id), + constraint fk_acct foreign key (acct_id) references public.accounts (acct_id) on delete set null ); -- Permissions - -ALTER TABLE public.budgetdetails OWNER TO acedanger; -GRANT ALL ON TABLE public.budgetdetails TO acedanger; -GRANT ALL ON TABLE public.budgetdetails TO budgetuser; +alter table public.budgetdetails OWNER to acedanger; +grant all on table public.budgetdetails to acedanger; +grant all on table public.budgetdetails to budgetuser; \ No newline at end of file diff --git a/postgres/tables/budgetimport.sql b/postgres/tables/budgetimport.sql index 1b75d47..26f25bf 100644 --- a/postgres/tables/budgetimport.sql +++ b/postgres/tables/budgetimport.sql @@ -1,11 +1,13 @@ -DROP TABLE public.budgetimport; +drop table public.budgetimport; create table public.budgetimport ( - dt bpchar(20) NULL, - amount numeric(10, 2) NULL, - description bpchar(200) NULL + dt bpchar (20) null, + amount numeric(10, 2) null, + description bpchar (200) null ); -ALTER TABLE public.budgetimport OWNER TO acedanger; -GRANT ALL ON TABLE public.budgetimport TO acedanger; -GRANT ALL ON TABLE public.budgetimport TO budgetuser; \ No newline at end of file +alter table public.budgetimport OWNER to acedanger; + +grant all on table public.budgetimport to acedanger; + +grant all on table public.budgetimport to budgetuser; \ No newline at end of file diff --git a/postgres/temp.sql b/postgres/temp.sql index e890cb7..50f92cf 100644 --- a/postgres/temp.sql +++ b/postgres/temp.sql @@ -1,63 +1,74 @@ - - -select 'Import' as TBL, count(1) as REC_CNT from public.budgetimport +select + 'Import' as TBL, + count(1) as REC_CNT +from + public.budgetimport union all -select 'Detail' as TBL, count(1) as REC_CNT from public.budgetdetails; - - -select acct.acct_friendly_name, count(1) as "Number of Transactions" -from - public.budgetdetails trx - inner join public.accounts acct using(acct_id) -group by acct.acct_friendly_name - - -select - acct.acct_friendly_name - , extract(year from trx.trx_date) trx_year - , lower(trx.trx_description) trx_description - , avg(abs(trx.trx_amount))::numeric(7,2) avg_amt - , count(trx.trx_description) rec_cnt - , min(abs(trx.trx_amount))::numeric(7,2) min_amt - , max(abs(trx.trx_amount))::numeric(7,2) max_amt - , sum(abs(trx.trx_amount))::numeric(9,2) ttl_amt +select + 'Detail' as TBL, + count(1) as REC_CNT from - public.budgetdetails trx - inner join public.accounts acct using(acct_id) -where - trx.trx_date <= current_date - and abs(trx.trx_amount) > 0 --- and lower(acct.account_friendly_name) like '%savings' + public.budgetdetails; + +select + acct.acct_friendly_name, + count(1) as "Number of Transactions" +from + public.budgetdetails trx + inner join public.accounts acct using (acct_id) group by - trx_year, acct.acct_friendly_name, lower(trx_description) -having - count(1) > 2 -order by - trx_year desc - , acct.acct_friendly_name - , rec_cnt desc - , lower(trx.trx_description); - - -select - bal.account_friendly_name - , bal.transaction_date - , bal.transaction_day_of_week - , age(transaction_date, current_date) as days_from_today - , bal.transaction_description - , bal.transaction_amount - , bal.running_bal + acct.acct_friendly_name +select + acct.acct_friendly_name, + extract( + year + from + trx.trx_date + ) trx_year, + lower(trx.trx_description) trx_description, + avg(abs(trx.trx_amount))::numeric(7, 2) avg_amt, + count(trx.trx_description) rec_cnt, + min(abs(trx.trx_amount))::numeric(7, 2) min_amt, + max(abs(trx.trx_amount))::numeric(7, 2) max_amt, + sum(abs(trx.trx_amount))::numeric(9, 2) ttl_amt from - public.runbal bal -where - lower(account_friendly_name) = 'joint checking' - and transaction_date between - (current_date - interval '1 week') - and ( - current_date + interval '3 weeks' - )::date -; + public.budgetdetails trx + inner join public.accounts acct using (acct_id) +where + trx.trx_date <= current_date + and abs(trx.trx_amount) > 0 + -- and lower(acct.account_friendly_name) like '%savings' +group by + trx_year, + acct.acct_friendly_name, + lower(trx_description) +having + count(1) > 2 +order by + trx_year desc, + acct.acct_friendly_name, + rec_cnt desc, + lower(trx.trx_description); +select + bal.account_friendly_name, + bal.transaction_date, + bal.transaction_day_of_week, + age (transaction_date, current_date) as days_from_today, + bal.transaction_description, + bal.transaction_amount, + bal.running_bal +from + public.runbal bal +where + lower(account_friendly_name) = 'joint checking' + and transaction_date between (current_date - interval '1 week') and (current_date + interval '3 weeks')::date; -select * -from public.get_transactions_for_period('joint checking', '3/1/2023'::date, '3/31/2023'::date) +select + * +from + public.get_transactions_for_period ( + 'joint checking', + '3/1/2023'::date, + '3/31/2023'::date + ) \ No newline at end of file diff --git a/postgres/views/runbal.sql b/postgres/views/runbal.sql index c76e8f4..4ea2726 100644 --- a/postgres/views/runbal.sql +++ b/postgres/views/runbal.sql @@ -1,23 +1,22 @@ drop view if exists public.runbal; -create view public.runbal -as +create view public.runbal as select - acct.acct_bank_name as account_bank_name - , acct.acct_type as account_type - , acct.acct_number as account_number - , acct.acct_friendly_name as account_friendly_name - , trx.trx_date as transaction_date - , trx.trx_description as transaction_description - , trx.trx_amount::numeric(8,2) as transaction_amount - , to_char(trx.trx_date, 'day') transaction_day_of_week - , sum(trx.trx_amount) - over( - partition by trx.acct_id - order by - trx.trx_date - , trx.trx_amount desc rows unbounded preceding - ) running_bal + acct.acct_bank_name as account_bank_name, + acct.acct_type as account_type, + acct.acct_number as account_number, + acct.acct_friendly_name as account_friendly_name, + trx.trx_date as transaction_date, + trx.trx_description as transaction_description, + trx.trx_amount::numeric(8, 2) as transaction_amount, + to_char(trx.trx_date, 'day') transaction_day_of_week, + sum(trx.trx_amount) over ( + partition by + trx.acct_id + order by + trx.trx_date, + trx.trx_amount desc rows unbounded preceding + ) running_bal from - public.budgetdetails trx - join public.accounts acct using (acct_id) + public.budgetdetails trx + join public.accounts acct using (acct_id) \ No newline at end of file