I want to get conversion rate in postgresql. My data look like below:
input:
id | count | type | converted |
---|---|---|---|
1 | 30 | A | true |
2 | 20 | A | false |
3 | 13 | B | false |
4 | 7 | B | true |
As first step, I would like to get a sum of counts for each type with associated count field. I tried with different variations of SUM()
but couldn’t get it. This middle step would look like:
id | count | type | converted | sum |
---|---|---|---|---|
1 | 30 | A | true | 50 |
2 | 7 | B | true | 20 |
I expect the following output:
id | conversion_rate | type |
---|---|---|
1 | 60% | A |
2 | 35% | B |
but my problem is to write proper SQL to get to the middle step.
Advertisement
Answer
I think for the middle step you’d rather need something like:
create temporary table input( id int primary key generated always as identity, count int, type text, converted boolean ); insert into input(count, type, converted) values (30,'A',true), (20,'A',false), (13,'B',false), (7,'B',true); select sum(case when converted then count else 0 end) as count_converted, sum(count) as count, type from input group by type;
So your target query would just be:
select ( sum(case when converted then count else 0 end)::float / sum(count)::float )*100 as conversion_rate, type from input group by type;
Result:
conversion_rate | type -----------------+------ 35 | B 60 | A