Budget Control
view name = 'budget_control'
[NEW] Query
WITH fullmonths AS (
SELECT to_char('2019-01-01'::date + ((n.n || ' months'::text)::interval), 'YYYY-MM'::text) AS month
FROM generate_series(0, 12 * (2025 - 2019) + 11) n(n)
), transactionsummary AS (
SELECT to_char(transaction.payment_date::timestamp with time zone, 'YYYY-MM'::text) AS month,
transaction.branch,
transaction.budget_category,
transaction.coa_category,
transaction.coa,
transaction.transaction_type,
transaction.pic,
sum(transaction.amount_idr) AS budget_usage
FROM transaction
WHERE EXTRACT(year FROM transaction.payment_date) <= 2025::numeric
GROUP BY (to_char(transaction.payment_date::timestamp with time zone, 'YYYY-MM'::text)), transaction.branch, transaction.budget_category, transaction.coa_category, transaction.coa, transaction.transaction_type, transaction.pic
), budgetsummary AS (
SELECT budget.branch,
budget.budget_category,
budget.coa_category,
budget.coa,
fm.month,
sum(
CASE
WHEN fm.month = '2025-01'::text THEN budget."2025_Jan"
WHEN fm.month = '2025-02'::text THEN budget."2025_Feb"
WHEN fm.month = '2025-03'::text THEN budget."2025_Mar"
WHEN fm.month = '2025-04'::text THEN budget."2025_Apr"
WHEN fm.month = '2025-05'::text THEN budget."2025_May"
WHEN fm.month = '2025-06'::text THEN budget."2025_Jun"
WHEN fm.month = '2025-07'::text THEN budget."2025_Jul"
WHEN fm.month = '2025-08'::text THEN budget."2025_Aug"
WHEN fm.month = '2025-09'::text THEN budget."2025_Sep"
WHEN fm.month = '2025-10'::text THEN budget."2025_Oct"
WHEN fm.month = '2025-11'::text THEN budget."2025_Nov"
WHEN fm.month = '2025-12'::text THEN budget."2025_Dec"
ELSE 0::numeric
END) AS budget
FROM budget
CROSS JOIN fullmonths fm
GROUP BY budget.branch, budget.budget_category, budget.coa_category, budget.coa, fm.month
), combined AS (
SELECT fm.month,
COALESCE(ts.branch, bs.branch) AS branch,
COALESCE(ts.budget_category, bs.budget_category) AS budget_category,
COALESCE(ts.coa_category, bs.coa_category) AS coa_category,
COALESCE(ts.coa, bs.coa) AS coa,
COALESCE(ts.transaction_type, NULL::text) AS transaction_type,
COALESCE(ts.pic, NULL::text) AS pic,
COALESCE(ts.budget_usage, 0::numeric) AS budget_usage,
COALESCE(bs.budget, 0::numeric) AS budget
FROM fullmonths fm
LEFT JOIN transactionsummary ts ON fm.month = ts.month
FULL JOIN budgetsummary bs ON fm.month = bs.month AND (ts.branch = bs.branch OR ts.branch IS NULL) AND (ts.budget_category = bs.budget_category OR ts.budget_category IS NULL) AND (ts.coa_category = bs.coa_category OR ts.coa_category IS NULL) AND (ts.coa = bs.coa OR ts.coa IS NULL)
)
SELECT month,
branch,
budget_category,
coa_category,
coa,
transaction_type,
pic,
budget_usage,
budget,
budget - budget_usage AS budget_remaining
FROM combined
ORDER BY month, branch, budget_category, coa_category, coa;
Last updated