SELECT description, sku, level2, level3, rev, qty, trend from ( SELECT *, ROW_NUMBER () OVER ( PARTITION BY level2 ORDER BY SUM(revenue) DESC ) rownum, SUM(revenue) OVER (PARTITION BY level2) total, ROUND(SUM(revenue), 2) as rev, SUM(quantity) as qty, trend FROM ( select *, cast(past as float) / 3 as past, round( cast(present as float) /(cast(past as float) / 3.0), 2 ) as trend from ( select *, sum(quantity) FILTER ( WHERE year = %[1]s and month between %[3]s and %[4]s ) over (PARTITION BY description) as past, sum(quantity) FILTER ( WHERE year = %[1]s and month = %[2]s ) over (PARTITION BY description) as present from data ) ) where year = %[1]s and month = %[2]s GROUP BY description ORDER BY total DESC ) WHERE rownum <= 10 and rev > 0 order by (sum(rev) over ( partition by level2 )) desc;