I have below query which gives me data with three columns – type
, amount
and total
for current week using week_number
column.
select type, case WHEN (type = 'PROC1' AND contractdomicilecode = 'UIT') THEN 450 WHEN (type = 'PROC1' AND contractdomicilecode = 'KJH') THEN 900 WHEN (type = 'PROC2' AND contractdomicilecode = 'LOP') THEN 8840 WHEN (type = 'PROC2' AND contractdomicilecode = 'AWE') THEN 1490 WHEN (type = 'PROC3' AND contractdomicilecode = 'MNH') THEN 1600 WHEN (type = 'PROC3' AND contractdomicilecode = 'LKP') THEN 1900 END as amount, total from xyz.orders pa join (select clientid as clientid, max(version) as version from xyz.orders where consumerid IN (select distinct entity_id from abc.items where week_number = extract(week from current_date) and item_type like '%Ionize - Data%' ) and createdfor ='BLOCK' and holder='RELAY_FUTURES' group by clientid) pb on pa.clientid = pb.clientid and pa.version = pb.version;
Below is the output I get back as of now with above query:
type amount total --------------------------- PROC1 450 1768 PROC1 900 123 PROC1 450 456 PROC2 8840 99897 PROC2 1490 2223 PROC2 8840 9876 PROC3 1900 23456 PROC3 1600 12498 PROC3 1600 28756
Problem Statement
Now I need to calculate the percentage for each type
by using below formula:
- For each
type
(sum(total) – sum(amount)) / sum(amount). - So for
PROC1
type, (sum of all ‘total’ coumn – sum of all ‘amount’ column) / sum of all ‘amount’ column. - Similarly for
PROC2
andPROC3
as well. - Also I need extra
OVERALL
type as well which will be sum of allPROC1
+PROC2
+PROC3
values.
At the end I should be seeing this output:
type sum_amount sum_total percentage ---------------------------------------------- PROC1 1800 2347 0.3038 PROC2 10330 111996 9.841 PROC3 5100 64710 11.688 OVERALL 17230 179053 9.3919
Is this possible to do in redshift?
Advertisement
Answer
You can phrase this as:
with t as ( <your query here> ) select type, sum(amount) as amount, sum(total) as total, (sum(total) - sum(amount)) * 1.0 / sum(amount) as ratio from t group by type, amount, total union all select 'Overall', sum(amount), sum(total), (sum(total) - sum(amount)) * 1.0 / sum(amount) as ratio from t;
In practice, this will put the “Overall” column last. However, that is not guaranteed unless you add an ORDER BY
.