I made this strange example, trying to illustrate what I want to do (this is stupid, but carrying with me):
Consider the following table:
EMPLOYEES

married, certified, and religious are just logical fields (in the case of Oracle, they are of type NUMBER (1,0)).
I need to come up with SQL, which displays for each employee, the number of married, certified and religious employees in the following salary categories:
- A
SALARY > 2000 - B
SALARY BETWEEN 1000 AND 2000 - C
SALARY < 1000
Based on the dataset above, here is what I expect to get:

So far, I just came up with the following SQL:
SELECT COUNT(CASE WHEN married = 1 THEN 1 END) as MARRIED, COUNT(CASE WHEN certified = 1 THEN 1 END) as certified, COUNT(CASE WHEN religious = 1 THEN 1 END) as religious, hire_year FROM employees GROUP BY hire_year;
The result of executing this SQL is:

This is almost what I need, but I also need to divide these counters further into groups depending on the salary range.
I suppose some kind of analytic function that divides groups into buckets based on some SQL expression will help, but I can't figure out which one. I tried with NTILE , but it expects a positive constant as a parameter, not an SQL expression (e.g. SALARY BETWEEN X and Y ).