This is my first question in this community. It has helped me a lot before, so thank you all for being out there!
I have a problem with ORACLE PLSQL, I’m trying to create a pivot table that counts the number of people that are in a given salary range. I want cities as rows and salary_range as columns. My problem is when I select a column alias for the pivot table.
In table A I have the rows of all employees and their salaries, and in table B, I have their city. Both of them are linked by a key column named id_dpto. First, I join both tables selecting employee names, salaries, and cities. Second, I use CASE WHEN
to create the range of salaries (less than 1000 and between 1000 and 2500 dollars) and give it the column alias SALARY_RANGE
. Until here, everything is ok and the code runs perfectly.
My problem is on the third step. I use a subquery and PIVOT command to create the pivot to count by cities and salary_range, but when I use the select command in the alias it doesn’t work, my error message is "'F'.'SALARY_RANGE' INVALID IDENTIFYER"
. Can you help me what is the proper way to select a created column (salary_range) in a pivot table? I’ve tried both, with the F after the from and without it.
Initial data base
| Name | salary | city | | ---- | ------ | ------ | |john | 999 | NY | |adam | 500 | NY | |linda | 1500 | NY | |Matt | 2000 | London | |Joel | 1500 | London |
Desired result:
city | salary less than 1000 | salary between 1000 and 2500 |
---|---|---|
NY | 2 | 1 |
London | 0 | 2 |
My code:
SELECT F.SALARY_RANGE, F.CITY FROM (SELECT A.NAMES, A.SALARY, C.CITY, CASE WHEN SALARY < 1000 THEN 'LESS THAN 1000' WHEN SALARY < 2500 THEN 'BETWEEN 1000 AND 2500' END AS SALARY_RANGE FROM EMPLOYEES A LEFT JOIN XXX B ON A.ID_DPTO = B.ID_DPTO) F PIVOT (COUNT(SALARY_RANGE) FOR SALARY_RANGE IN ('LESS THAN 1000', 'BETWEEN 1000 AND 2500') )
Thanks for helping me!
Advertisement
Answer
I think you should use * and exclude SALARY and NAMES from subquery:
SELECT * FROM (SELECT B.CITY, CASE WHEN SALARY < 1000 THEN 'LESS THAN 1000' WHEN SALARY < 2500 THEN 'BETWEEN 1000 AND 2500' END AS SALARY_RANGE FROM EMPLOYEES A LEFT JOIN XXX B ON A.ID_DPTO = B.ID_DPTO) F PIVOT(COUNT(SALARY_RANGE) FOR SALARY_RANGE IN('LESS THAN 1000', 'BETWEEN 1000 AND 2500'))