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;
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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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')

View File

@@ -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;

View File

@@ -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;
alter table public.budgetimport OWNER to acedanger;
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, 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
)

View File

@@ -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)