use Leo
go

alter PROCEDURE dbo.proc_MonthlyIncomeExpense (
  @p_Year smallint
)
AS

with credit as (
  SELECT
    det.TrxDate
    , ctg.CtgDescription
    , det.TrxAmount
    , YR=year(det.TrxDate)
    , MO=month(det.TrxDate)
  FROM
    dbo.BUDGET_CATEGORY ctg
    JOIN BUDGET_DETAIL det ON ctg.CtgDescription = det.TrxDescription
  WHERE
    ctg.CtgCredit = 1
    and year(det.TrxDate) = @p_Year
)
, debit as (
  select
    det.TrxDescription
    , det.TrxDate
    , det.TrxAmount
    , YR=year(det.TrxDate)
    , MO=month(det.TrxDate)
  from
    dbo.BUDGET_DETAIL det
    left join dbo.BUDGET_CATEGORY ctg on ctg.CtgDescription = det.TrxDescription
  where
    year(det.TrxDate) = @p_Year
    and det.TrxDescription <> 'Initial Balance'
    and det.TrxAmount <> 0
    and isnull(CtgCredit, 0) = 0
)

select
  crd.YR
  , crd.MO
  , EXPENSES=dbt.TTL
  , INCOME=crd.TTL
  , TTL=crd.TTL+dbt.TTL
from (
    select YR, MO, TTL=sum(credit.TrxAmount) from credit group by YR, MO
  ) crd
  join (
    select YR, MO, TTL=sum(debit.TrxAmount) from debit group by YR, MO
  ) dbt on crd.YR = dbt.YR and crd.MO = dbt.MO

return
go