1

这是我在这个社区的第一个问题。它以前对我有很大帮助,所以谢谢大家的光临!

我对 ORACLE PLSQL 有疑问,我正在尝试创建一个数据透视表来计算给定工资范围内的人数。我希望城市作为行,salary_range 作为列。我的问题是当我为数据透视表选择列别名时。

在表 AI 中有所有员工的行及其工资,在表 B 中,我有他们的城市。它们都由一个名为 id_dpto 的键列链接。首先,我加入两个表,选择员工姓名、薪水和城市。其次,我CASE WHEN用来创建薪水范围(小于 1000 美元和介于 1000 到 2500 美元之间)并为其指定列 alias SALARY_RANGE。到这里为止,一切正常,代码运行完美。

我的问题在第三步。我使用子查询和 PIVOT 命令创建要按城市和薪金范围计数的数据透视表,但是当我在别名中使用 select 命令时它不起作用,我的错误消息是"'F'.'SALARY_RANGE' INVALID IDENTIFYER". 您能帮我在数据透视表中选择创建的列(salary_range)的正确方法是什么吗?我都试过了,在 from 和没有它之后都有 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')
     )

谢谢你帮助我!

4

1 回答 1

1

我认为您应该使用 * 并从子查询中排除 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'))
于 2021-02-02T23:14:15.363 回答