Reputation: 1429
My data is as follows:
QUARTER_CMT DEPT SALES 7 A 39 8 A 23 9 A 33 10 A 45 11 A 50 12 A 110 1 B 44 2 B 56 3 B 87 4 B 22
I am aiming at getting total SALES
for every 4 quarters by DEPT
and retain Quarter_CNT
number as a rollup.
QUARTER_CMT DEPT SALES_TOT 7 A 140 11 A 160 1 B 209
Work in progress code. I thought to sub-group totals and join to latest QUARTER_CMT
to have one row by DEPT
:
SELECT ROW_NUMBER() OVER(PARTITION BY DEPTORDER BY QUARTER_CMT) as RN, QUARTER_CMT, DEPT, --RANK() OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRankOrg, --NTILE(4) OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRank, SALES FROM TABLE_1 ORDER BY DEPT, QUARTER_CMT
Upvotes: 2
Views: 1269
Reputation: 1434
Try this:
with a as (
select
row_number() over(partition by dept order by quarter_cmt)-1 n,
quarter_cmt, dept, sales
from t
order by dept, quarter_cmt
)
select min(quarter_cmt) quarter_cmt, dept, sum(sales) sales_tot
from a
group by dept, floor(n/4)
order by dept, quarter_cmt
;
Assuming this sample data:
create or replace table t as
select $1 QUARTER_CMT, $2 DEPT, $3 SALES from values
(7,'A',39),
(8,'A',23),
(9,'A',33),
(10,'A',45),
(11,'A',50),
(12,'A',110),
(1,'B',44),
(2,'B',56),
(3,'B',87),
(4,'B',22)
;
Upvotes: 2
Reputation: 13393
you need to divide row_number to 5 for determine the periods
SELECT MIN (QUARTER_CMT) QUARTER_CMT, DEPT, SUM(SALES) SALES, PART
FROM (
SELECT *, FLOOR(ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY QUARTER_CMT) / 5) AS PART
FROM TABLE_1
) AS T
GROUP BY DEPT, PART
ORDER BY DEPT, PART
Result:
QUARTER_CMT DEPT SALES PART
----------- ---- ----------- -----------
7 A 140 0
11 A 160 1
1 B 209 0
Upvotes: 1