【问题标题】:Operate on pseudocolumn in oracle在oracle中对伪列进行操作
【发布时间】:2014-10-11 03:03:30
【问题描述】:

我正在创建两个我希望对其进行操作的伪列(取它们的百分比差异),这通常可以使用两个数字字段来完成。但是我遇到了一个错误;

ORA-00904: "pseudocolumn_B": 无效标识符

我的代码:

select DW.mykey
     , sum(case
             when ms.day_date BETWEEN TO_DATE('10/09/2014', 'DD/MM/YYYY') AND TO_DATE('07/10/2014', 'DD/MM/YYYY')
               then ms.numbers
             else 0
           end) pseudocolumn_A
     , sum(case
             when ms.day_date BETWEEN TO_DATE('03/08/2014', 'DD/MM/YYYY') AND TO_DATE('09/09/2014', 'DD/MM/YYYY')
               then ms.numbers
             else 0
           end) pseudocolumn_B
      (pseudocolumn_A - pseudocolumn_B)/pseudocolumn_B as change_in_pseudo_columns --This is the line that fails.
from table_1 DW
     join table_2 ms
       on ms.mykey = DW.mykey
    WHERE dw.some_field = 'some_value'
group by DW.mykey
order by DW.mykey

我相信我之前已经能够使用非 Oracle 数据库做到这一点,因此这对 Oracle 来说有些不同,但我可能错了。如上尝试,如何对伪列进行操作?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您不能在同一 SELECT 语句和 WHERE 子句中使用别名列

    您可以使用 cte 并获取所需的聚合列,然后对它们进行进一步计算,如下所示

    with cte
    as
    (
    select DW.mykey
         , sum(case
                 when ms.day_date BETWEEN TO_DATE('10/09/2014', 'DD/MM/YYYY') AND TO_DATE('07/10/2014', 'DD/MM/YYYY')
                   then ms.numbers
                 else 0
               end) psuedocolumn_A
         , sum(case
                 when ms.day_date BETWEEN TO_DATE('03/08/2014', 'DD/MM/YYYY') AND TO_DATE('09/09/2014', 'DD/MM/YYYY')
                   then ms.numbers
                 else 0
               end) psuedocolumn_B
    from table_1 DW
         join table_2 ms
           on ms.mykey = DW.mykey
        WHERE dw.some_field = 'some_value'
    group by DW.mykey
    )
    select * ,
          (psuedocolumn_A - psuedocolumn_B)/psuedocolumn_B 
    from cte
    order by cte.mykey
    

    【讨论】:

    • CTE 在内部被解析为内联视图或临时表,因此基本上它是一个子查询,当您想要避免多个子查询时很有用。在 OP 的情况下,子查询只使用一次。因此,CTE 不会产生任何显着差异。
    • @LalitKumarB,是的,你是对的,子查询就足够了,我认为 cte 可读性差。
    【解决方案2】:

    您不能在同一查询中使用列别名作为列名。将其用作子查询。

    将以下psuedocolumn_A - psuedocolumn_B)/psuedocolumn_B as change_in_psuedo_columns 作为外部查询:

    select psuedocolumn_A - psuedocolumn_B)/psuedocolumn_B as change_in_psuedo_columns 
    from (your query in original post)
    

    或者,即使是 INLINE VIEW 也足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2011-11-21
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多