@@ -72,29 +72,30 @@ To get the top 5 payees by spending per budget, you could do:
7272
7373``` sql
7474WITH
75- ranked_payees AS (
76- SELECT
77- b .name AS budget_name,
78- p .name AS payee,
79- SUM (t .amount ) / - 1000 .0 AS net_spent,
80- ROW_NUMBER() OVER (
81- PARTITION BY
82- b .id
83- ORDER BY
84- SUM (t .amount ) ASC
85- ) AS rnk
86- FROM
87- flat_transactions t
88- JOIN payees p ON t .payee_id = p .id
89- JOIN budgets b ON t .budget_id = b .id
90- WHERE
91- p .name != ' Starting Balance'
92- AND p .transfer_account_id IS NULL
93- AND NOT t .deleted
94- GROUP BY
95- b .id ,
96- p .id
97- )
75+ ranked_payees AS (
76+ SELECT
77+ b .name AS budget_name,
78+ p .name AS payee,
79+ SUM (t .amount ) / - 1000 .0 AS net_spent,
80+ ROW_NUMBER() OVER (
81+ PARTITION BY
82+ b .id
83+ ORDER BY
84+ SUM (t .amount ) ASC
85+ ) AS rnk
86+ FROM
87+ flat_transactions AS t
88+ INNER JOIN payees AS p ON t .payee_id = p .id
89+ INNER JOIN budgets AS b ON t .budget_id = b .id
90+ WHERE
91+ p .name != ' Starting Balance'
92+ AND p .transfer_account_id IS NULL
93+ AND NOT t .deleted
94+ GROUP BY
95+ b .id ,
96+ p .id
97+ )
98+
9899SELECT
99100 budget_name,
100101 payee,
@@ -104,45 +105,50 @@ FROM
104105WHERE
105106 rnk <= 5
106107ORDER BY
107- budget_name,
108- net_spent DESC
109- ;
108+ budget_name ASC ,
109+ net_spent DESC ;
110110```
111111
112112To get payees with no transactions:
113113
114114``` sql
115+ WITH st AS (
116+ SELECT
117+ budget_id,
118+ payee_id,
119+ MAX (NOT deleted) AS has_active_transaction
120+ FROM
121+ scheduled_flat_transactions
122+ GROUP BY
123+ budget_id,
124+ payee_id
125+ ),
126+
127+ t AS (
128+ SELECT
129+ budget_id,
130+ payee_id,
131+ MAX (NOT deleted) AS has_active_transaction
132+ FROM
133+ flat_transactions
134+ GROUP BY
135+ budget_id,
136+ payee_id
137+ )
138+
115139SELECT DISTINCT
116- b .name as budget,
117- p .name as payee
140+ b .name AS budget,
141+ p .name AS payee
118142FROM
119- budgets b
120- JOIN payees p ON b .id = p .budget_id
121- LEFT JOIN (
122- SELECT
123- budget_id,
124- payee_id,
125- MAX (NOT deleted) AS has_active_transaction
126- FROM
127- flat_transactions
128- GROUP BY
129- budget_id,
130- payee_id
131- ) t ON (
143+ budgets AS b
144+ INNER JOIN payees AS p ON b .id = p .budget_id
145+ LEFT JOIN t
146+ ON (
132147 p .id = t .payee_id
133148 AND p .budget_id = t .budget_id
134149 )
135- LEFT JOIN (
136- SELECT
137- budget_id,
138- payee_id,
139- MAX (NOT deleted) AS has_active_transaction
140- FROM
141- scheduled_flat_transactions
142- GROUP BY
143- budget_id,
144- payee_id
145- ) st ON (
150+ LEFT JOIN st
151+ ON (
146152 p .id = st .payee_id
147153 AND p .budget_id = st .budget_id
148154 )
@@ -158,7 +164,6 @@ WHERE
158164 OR NOT st .has_active_transaction
159165 )
160166ORDER BY
161- 1 ,
162- 2
163- ;
167+ budget,
168+ payee;
164169```
0 commit comments