mirror of
https://github.com/acedanger/budget-database.git
synced 2025-12-05 22:50:13 -08:00
refactor SQL scripts for consistency and style improvements
This commit is contained in:
@@ -1 +1 @@
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
create extension IF not exists "uuid-ossp";
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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')
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
)
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user