这是我在这个社区中的第一个问题。之前它对我有很大帮助,所以谢谢大家在这里!
我在ORACLE PLSQL上遇到问题,我试图创建一个数据透视表,该表计算给定薪资范围内的人数。我希望城市作为行,而薪金范围作为列。我的问题是当我为数据透视表选择列别名时。
在表AI中,列出了所有雇员及其工资的行,在表B中,列出了他们的城市。它们都通过名为id_dpto的键列链接。首先,我加入两个表,选择员工姓名,薪水和城市。其次,我使用CASE WHEN
创建工资范围(小于1000且在1000到2500美元之间),并为其指定列别名SALARY_RANGE
。到这里为止,一切正常,代码可以完美运行。
我的问题在第三步。我使用子查询和PIVOT命令创建了按城市和薪金范围进行计数的数据透视表,但是当我在别名中使用select命令时,它不起作用,我的错误消息是"'F'.'SALARY_RANGE' INVALID IDENTIFYER"
。您能帮我在数据透视表中选择创建的列(salary_range)的正确方法是什么?我已经尝试过这两个,在F后面有F,也没有F。
初始数据库
| Name | salary | city |
| ---- | ------ | ------ |
|john | 999 | NY |
|adam | 500 | NY |
|linda | 1500 | NY |
|Matt | 2000 | London |
|Joel | 1500 | London |
所需结果:
市 | 工资少于1000 | 1000至2500之间的薪水 |
---|---|---|
新 | 2 | 1个 |
伦敦 | 0 | 2 |
我的代码:
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')
)
感谢您的帮助!
我认为您应该使用*并从子查询中排除SALARY和NAMES:
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'))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句