refactor SQL scripts for consistency and style improvements

This commit is contained in:
Peter Wood
2025-03-06 08:26:39 -05:00
parent b6a6ca3b38
commit 07b8185c35
10 changed files with 192 additions and 168 deletions

View File

@@ -1 +1 @@
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; create extension IF not exists "uuid-ossp";

View File

@@ -1,17 +1,15 @@
drop function if exists public.get_account_id; drop function if exists public.get_account_id;
create or replace function public.get_account_id( create
p_bank_name varchar or replace function public.get_account_id (
, p_bank_account_number varchar p_bank_name varchar,
) p_bank_account_number varchar
returns int ) returns int LANGUAGE plpgsql as $$
LANGUAGE plpgsql
AS $$
declare declare
_account_id int; _account_id int;
begin begin
raise notice 'FUNCTION: get_account_id'; raise notice 'FUNCTION: get_account_id';
-- E'\n' is new line -- 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; 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; end;
$$; $$;
GRANT EXECUTE ON function public.get_account_id(varchar, varchar) TO acedanger; grant
GRANT EXECUTE ON function public.get_account_id(varchar, varchar) TO budgetuser; execute on function public.get_account_id (varchar, varchar) to acedanger;
grant
execute on function public.get_account_id (varchar, varchar) to budgetuser;

View File

@@ -1,31 +1,25 @@
drop function if exists public.get_transactions_for_period; drop function if exists public.get_transactions_for_period;
create or replace function public.get_transactions_for_period( create
p_account_name text or replace function public.get_transactions_for_period (p_account_name text, p_start date, p_end date) returns table (
, p_start date bank_name text,
, p_end date account_type text,
) account_number text,
returns table ( account_friendly_name text,
bank_name text transaction_date date,
, account_type text transaction_description text,
, account_number text transaction_amount numeric(8, 2),
, account_friendly_name text transaction_day_of_week text,
, transaction_date date running_bal numeric
, transaction_description text ) LANGUAGE plpgsql as $$
, transaction_amount numeric(8,2)
, transaction_day_of_week text
, running_bal numeric
)
LANGUAGE plpgsql
AS $$
begin begin
raise notice 'FUNCTION: get_transactions'; raise notice 'FUNCTION: get_transactions';
-- E'\n' is new line -- E'\n' is new line
raise notice 'INPUT: % p_start = %; % p_end = %;', E'\n', p_start, E'\n', p_end; raise notice 'INPUT: % p_start = %; % p_end = %;', E'\n', p_start, E'\n', p_end;
return query return query
select select
bl.account_bank_name, bl.account_type, bl.account_number, bl.account_friendly_name 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_date, bl.transaction_description, bl.transaction_amount
, bl.transaction_day_of_week, bl.running_bal , bl.transaction_day_of_week, bl.running_bal
@@ -36,5 +30,8 @@ return query
end; end;
$$; $$;
GRANT EXECUTE ON function public.get_transactions_for_period(text, date, date) TO acedanger; grant
GRANT EXECUTE ON function public.get_transactions_for_period(text, date, date) TO budgetuser; 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;

View File

@@ -1,10 +1,8 @@
create
create or replace procedure public.import_transactions_from_csv( or replace procedure public.import_transactions_from_csv (
p_bank_name varchar p_bank_name varchar,
, p_bank_account_number varchar p_bank_account_number varchar
) ) language plpgsql as $$
language plpgsql
as $$
declare declare
_acct int; _acct int;
@@ -41,5 +39,8 @@ where coalesce(amount, 0) <> 0;
end end
$$; $$;
GRANT EXECUTE ON PROCEDURE public.import_transactions_from_csv(varchar, varchar) TO acedanger; grant
GRANT EXECUTE ON PROCEDURE public.import_transactions_from_csv(varchar, varchar) TO budgetuser; 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;

View File

@@ -1,26 +1,25 @@
CREATE OR REPLACE PROCEDURE public.update_budget_from_import( create
p_bank_name varchar or replace PROCEDURE public.update_budget_from_import (
, p_bank_account_number varchar p_bank_name varchar,
) p_bank_account_number varchar
LANGUAGE plpgsql ) LANGUAGE plpgsql as $$
AS $$
declare declare
_acct int; _acct int;
begin begin
raise notice 'PROC: update_budget_from_import'; 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; 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); _acct := public.get_account_id(p_bank_name, p_bank_account_number);
if _acct is null then if _acct is null then
raise notice 'could not get the account id'; raise notice 'could not get the account id';
end if; end if;
truncate public.budgetdetails; truncate public.budgetdetails;
insert into public.budgetdetails (trx_description, trx_date, trx_amount, acct_id) insert into public.budgetdetails (trx_description, trx_date, trx_amount, acct_id)
select select
description description
, cast(dt as date) as dt_converted , cast(dt as date) as dt_converted
, amount , amount
@@ -30,5 +29,8 @@ from public.budgetimport;
end end
$$; $$;
GRANT EXECUTE ON PROCEDURE public.update_budget_from_import(varchar, varchar) TO acedanger; grant
GRANT EXECUTE ON PROCEDURE public.update_budget_from_import(varchar, varchar) TO budgetuser; 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;

View File

@@ -1,25 +1,38 @@
drop table if exists public.accounts cascade; drop table if exists public.accounts cascade;
CREATE TABLE public.accounts( create table public.accounts (
acct_id serial, acct_id serial,
acct_bank_name varchar(50) not null, acct_bank_name varchar(50) not null,
acct_type varchar(50) not null, acct_type varchar(50) not null,
acct_number varchar(20) null, acct_number varchar(20) null,
acct_friendly_name varchar(50) null, acct_friendly_name varchar(50) null,
insert_dt_tm timestamp null default now(), created_at timestamp null default now(),
PRIMARY KEY( acct_id ) primary key (acct_id)
); );
-- Permissions -- 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 acedanger;
GRANT ALL ON TABLE public.accounts TO budgetuser; grant all on table public.accounts to budgetuser;
-- Populate table -- Populate table
truncate public.accounts; truncate public.accounts;
INSERT INTO public.accounts (bank_name, account_type, friendly_name, account_number) values insert into
('Bank of America', 'Checking', 'Joint Checking', '4581') public.accounts (
, ('Ally', 'Savings', 'Joint Savings', '9969') bank_name,
, ('Ally', 'Savings', 'Vacation Savings', '6268') account_type,
friendly_name,
account_number
)
values
(
'Bank of America',
'Checking',
'Joint Checking',
'4581'
),
('Ally', 'Savings', 'Joint Savings', '9969'),
('Ally', 'Savings', 'Vacation Savings', '6268')

View File

@@ -1,21 +1,19 @@
-- public.budgetdetails definition -- public.budgetdetails definition
-- Drop table drop table if exists public.budgetdetails cascade;
DROP table if exists public.budgetdetails cascade;
CREATE TABLE public.budgetdetails ( create table public.budgetdetails (
trx_id uuid NOT NULL DEFAULT uuid_generate_v4(), trx_id uuid not null default uuid_generate_v4 (),
trx_description text NOT NULL, trx_description text not null,
trx_date date NOT NULL, trx_date date not null,
trx_amount numeric NOT NULL, trx_amount numeric not null,
acct_id int NULL, acct_id int null,
insert_dt_tm timestamp NULL DEFAULT now(), created_at timestamp null default now(),
primary key ( trx_id ), primary key (trx_id),
constraint fk_acct foreign key ( acct_id ) references public.accounts(acct_id) on delete set null constraint fk_acct foreign key (acct_id) references public.accounts (acct_id) on delete set null
); );
-- Permissions -- Permissions
alter table public.budgetdetails OWNER to acedanger;
ALTER TABLE public.budgetdetails OWNER TO acedanger; grant all on table public.budgetdetails to acedanger;
GRANT ALL ON TABLE public.budgetdetails TO acedanger; grant all on table public.budgetdetails to budgetuser;
GRANT ALL ON TABLE public.budgetdetails TO budgetuser;

View File

@@ -1,11 +1,13 @@
DROP TABLE public.budgetimport; drop table public.budgetimport;
create table public.budgetimport ( create table public.budgetimport (
dt bpchar(20) NULL, dt bpchar (20) null,
amount numeric(10, 2) NULL, amount numeric(10, 2) null,
description bpchar(200) NULL description bpchar (200) null
); );
ALTER TABLE public.budgetimport OWNER TO acedanger; alter table public.budgetimport OWNER to acedanger;
GRANT ALL ON TABLE public.budgetimport TO acedanger;
GRANT ALL ON TABLE public.budgetimport TO budgetuser; grant all on table public.budgetimport to acedanger;
grant all on table public.budgetimport to budgetuser;

View File

@@ -1,63 +1,74 @@
select
'Import' as TBL,
select 'Import' as TBL, count(1) as REC_CNT from public.budgetimport count(1) as REC_CNT
from
public.budgetimport
union all union all
select 'Detail' as TBL, count(1) as REC_CNT from public.budgetdetails; select
'Detail' as TBL,
count(1) as REC_CNT
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
from from
public.budgetdetails trx public.budgetdetails;
inner join public.accounts acct using(acct_id)
where select
trx.trx_date <= current_date acct.acct_friendly_name,
and abs(trx.trx_amount) > 0 count(1) as "Number of Transactions"
-- and lower(acct.account_friendly_name) like '%savings' from
public.budgetdetails trx
inner join public.accounts acct using (acct_id)
group by group by
trx_year, acct.acct_friendly_name, lower(trx_description) acct.acct_friendly_name
having select
count(1) > 2 acct.acct_friendly_name,
order by extract(
trx_year desc year
, acct.acct_friendly_name from
, rec_cnt desc trx.trx_date
, lower(trx.trx_description); ) trx_year,
lower(trx.trx_description) trx_description,
avg(abs(trx.trx_amount))::numeric(7, 2) avg_amt,
select count(trx.trx_description) rec_cnt,
bal.account_friendly_name min(abs(trx.trx_amount))::numeric(7, 2) min_amt,
, bal.transaction_date max(abs(trx.trx_amount))::numeric(7, 2) max_amt,
, bal.transaction_day_of_week sum(abs(trx.trx_amount))::numeric(9, 2) ttl_amt
, age(transaction_date, current_date) as days_from_today
, bal.transaction_description
, bal.transaction_amount
, bal.running_bal
from from
public.runbal bal public.budgetdetails trx
where inner join public.accounts acct using (acct_id)
lower(account_friendly_name) = 'joint checking' where
and transaction_date between trx.trx_date <= current_date
(current_date - interval '1 week') and abs(trx.trx_amount) > 0
and ( -- and lower(acct.account_friendly_name) like '%savings'
current_date + interval '3 weeks' group by
)::date 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 * select
from public.get_transactions_for_period('joint checking', '3/1/2023'::date, '3/31/2023'::date) *
from
public.get_transactions_for_period (
'joint checking',
'3/1/2023'::date,
'3/31/2023'::date
)

View File

@@ -1,23 +1,22 @@
drop view if exists public.runbal; drop view if exists public.runbal;
create view public.runbal create view public.runbal as
as
select select
acct.acct_bank_name as account_bank_name acct.acct_bank_name as account_bank_name,
, acct.acct_type as account_type acct.acct_type as account_type,
, acct.acct_number as account_number acct.acct_number as account_number,
, acct.acct_friendly_name as account_friendly_name acct.acct_friendly_name as account_friendly_name,
, trx.trx_date as transaction_date trx.trx_date as transaction_date,
, trx.trx_description as transaction_description trx.trx_description as transaction_description,
, trx.trx_amount::numeric(8,2) as transaction_amount trx.trx_amount::numeric(8, 2) as transaction_amount,
, to_char(trx.trx_date, 'day') transaction_day_of_week to_char(trx.trx_date, 'day') transaction_day_of_week,
, sum(trx.trx_amount) sum(trx.trx_amount) over (
over( partition by
partition by trx.acct_id trx.acct_id
order by order by
trx.trx_date trx.trx_date,
, trx.trx_amount desc rows unbounded preceding trx.trx_amount desc rows unbounded preceding
) running_bal ) running_bal
from from
public.budgetdetails trx public.budgetdetails trx
join public.accounts acct using (acct_id) join public.accounts acct using (acct_id)