DEV Community

Sven Schannak
Sven Schannak

Posted on

MySQL calculate percentages

Information is only useful, if you view it in a context. In data analysis you should avoid to only look at absolute numbers. For example you could just get the number of all users that have signed up in the previous month:

SELECT COUNT(*) as has_orderd FROM users WHERE users.has_ordered = true AND YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
Enter fullscreen mode Exit fullscreen mode

Result:

has_ordered 450 
Enter fullscreen mode Exit fullscreen mode

But this number only gives you a certain amount of useful information. So you should look at that data, compared to all users that signed up the previous month:

SELECT COUNT(*) as total FROM users WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
Enter fullscreen mode Exit fullscreen mode

Result:

total 1100 
Enter fullscreen mode Exit fullscreen mode

If you want both data points next to each other, you can do the following:

SELECT SUM(users.has_ordered = true) as user_with_orders, COUNT(*) as total FROM users WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
Enter fullscreen mode Exit fullscreen mode

Result:

user_with_orders total 450 1100 
Enter fullscreen mode Exit fullscreen mode

And to calculate the percentage of all users that have signed up the last month, you can just do:

SELECT SUM(users.has_ordered = true) as user_with_orders, COUNT(*) as total, ((SUM(users.has_ordered = true)/COUNT(*)) * 100) as percentage FROM users WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
Enter fullscreen mode Exit fullscreen mode

Result:

user_with_orders total percentage 450 1100 40.9 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)