I have a column of profit. I need to count how hany results are in ranges of 5
-5<=Profit<0, 0<=profit<5, 5<= profit<10
In other words group profit from 0 up and down in gaps of 5 and count how many results in each group. Value of profit is not limited I can’t tell in advance the min and max values. How do I give each range an alias
First of all thanks for your quick response. This is not exactly what I ment.
Profit/5 gives the value of Profit divided by 5 e.g. if Profit=10 then profit=10/5=2.
I want to count how many time I have a profit value ranging fron 0 to 5, 5 to 10 and so on
I also want the same from0 to -5, -5 to -10.
It is important to me not to have a range like -3 to 2 .
I want 0>=profit<5 and up (count how many time I get profit value at this range
ANd I want -5>=profit<0
So i want 0 included and up. And less than 0 down.
And when you get your grouped results back, the profit GROUP is “like -3 to 2”… and if you multiply those group values by 5 again… you’ll get the lower bound of the group. (Note: We are making an assumption you’re using integers rather than floats. If decimal points are involved, the code gets a little more complex.)
You could do it with a CASE statement, if you really need to only see 3 results.
@m_hutley, how would you use a CASE statement in this case? I’m just curious how you’d approach it without it being gangly. Perhaps my brain is just fried from work at the moment.
Personally, I’d make a table of the profit ranges (you could use a temp table if you’re not going to do this often) and join, using Rudy’s original query as a sub-query…
CREATE TABLE ProfitRange(low integer, high integer);
INSERT INTO ProfitRange (low, high) VALUES(-5, 0);
INSERT INTO ProfitRange (low, high) VALUES(0, 5);
INSERT INTO ProfitRange (low, high) VALUES(5, 10);
INSERT INTO ProfitRange (low, high) VALUES(10, 15);
Note the JOIN condition for the sub-query. That’s using that instead of BETWEEN because between is inclusive, not exclusive and since you don’t want to include the high in the grouping…
SELECT PR.Low
, PR.High
, SUM(PM.how_many) AS RangeCount
FROM ProfitRange AS PR
JOIN (SELECT Profit/5 AS profit_group
, COUNT(*) AS how_many
FROM ....
GROUP BY Profit/5) AS PM ON PM.profit_group >= PR.Low AND PM.profit_group < PR.High
GROUP BY PR.Low
, PR.High