I have the following SQL script,
Select To_Char(A1.Date1, 'dd-mm-yyyy') As Date, B1.bm, A1.Number From A1 Inner Join Benchmarkdefs B1 On (A1.Bmik = B1.Bmik);
, which yields,
Date BM Number 11-08-2021 AA 1 12-08-2021 AA 2 13-08-2021 AA 3 14-08-2021 AA 4 15-08-2021 AA 5 11-08-2021 BB 12 12-08-2021 BB 13 13-08-2021 BB 14 14-08-2021 BB 15 15-08-2021 BB 16 11-08-2021 CC 22 12-08-2021 CC 23 13-08-2021 CC 24 14-08-2021 CC 25 15-08-2021 CC 26
I wish to create a column, Product
, that contains the product of Numbers
on each date within the same BM
group:
Date BM Number Product sum 11-08-2021 AA 1 120 12-08-2021 AA 2 120 13-08-2021 AA 3 120 14-08-2021 AA 4 120 15-08-2021 AA 5 120 11-08-2021 BB 12 524160 12-08-2021 BB 13 524160 13-08-2021 BB 14 524160 14-08-2021 BB 15 524160 15-08-2021 BB 16 524160 11-08-2021 CC 22 524160 12-08-2021 CC 23 7893600 13-08-2021 CC 24 7893600 14-08-2021 CC 25 7893600 15-08-2021 CC 26 7893600
To clarify, for BM =’AA’ the product should be 1*2*3*4*5=120
.
Thank you in advance! Best regards,
Advertisement
Answer
There isn’t a built-in product function; but you could use the exp/ln technique from this question, and adapt it to use an analytic sum:
select to_char(a1.date1, 'dd-mm-yyyy') as date1, b1.bm, a1.number1, round(cast(exp(sum(ln(cast(a1.number1 as binary_double))) over (partition by b1.bmik)) as number)) as product from a1 inner join benchmarkdefs b1 on (a1.bmik = b1.bmik);
DATE1 | BM | NUMBER1 | PRODUCT |
---|---|---|---|
12-08-2021 | AA | 2 | 120 |
11-08-2021 | AA | 1 | 120 |
13-08-2021 | AA | 3 | 120 |
14-08-2021 | AA | 4 | 120 |
15-08-2021 | AA | 5 | 120 |
12-08-2021 | BB | 13 | 524160 |
11-08-2021 | BB | 12 | 524160 |
13-08-2021 | BB | 14 | 524160 |
15-08-2021 | BB | 16 | 524160 |
14-08-2021 | BB | 15 | 524160 |
11-08-2021 | CC | 22 | 7893600 |
12-08-2021 | CC | 23 | 7893600 |
14-08-2021 | CC | 25 | 7893600 |
13-08-2021 | CC | 24 | 7893600 |
15-08-2021 | CC | 26 | 7893600 |
db<>fiddle showing some of the intermediate steps.
The column names in your example are illegal so I assume you just changed those for posting; so I’ve modified them slightly to make them valid.
Note that if your number can be zero then you may need to exclude that to prevent it erroring; if you have negative values you’ll need to handle those differently too; and you might want to adjust the round()
precision depending on your real data too.