Here is my sample data table:
| ID | Status | 
|---|---|
| 1 | New | 
| 1 | Processed | 
| 2 | New | 
| 2 | Processed | 
| 3 | New | 
| 3 | Processed | 
| 4 | Processed | 
| 5 | New | 
What I am trying to solve here is calculate the conversion rate from Status ‘New’ to Status ‘Processed’. From the dataset, only ID no.1,2 and 3 fulfilled the requirements of my problem, and ID no.4 and 5 do not have both stages. So by theory, the conversion rate should be 3/5 * 100% = 60%. How can I select the data in order to calculate the IDs that have both ‘New’ and ‘Processed’ status.
This is the code that I have tried but I know its wrong since it extracts all the IDs with no link between it.
SELECT 'Conversion rate from Assigned enquiry to In progess leads' as 'Name', round((a.processed / b.new),3) * 100 as 'Answer' FROM ( SELECT cast(count(ID)as float) as processed from table1 WHERE STATUS_ID = 'Processed' ) as a cross join ( SELECT cast(count(ID)as float) as new from table_1 WHERE STATUS_ID = 'NEW' ) as b
Advertisement
Answer
We can use conditional aggregation here:
WITH cte AS (
    SELECT CASE WHEN COUNT(CASE WHEN Status = 'New' THEN 1 END) > 0 AND
                     COUNT(CASE WHEN Status = 'Processed' THEN 1 END) > 0
                THEN 1 ELSE 0 END AS cnt
    FROM yourTable
    GROUP BY ID
)
SELECT 100.0 * SUM(cnt) / COUNT(*)
FROM cte;