" AMOUNT1"在使用它的上下文中无效

时间:2016-10-01 10:35:25

标签: sql db2

我在DB2中执行以下查询:

select  
  SUM (orders.totalproduct
      +orders.TOTALTAX
      +orders.totalshipping
      -orders.totaladjustment) as amount1 
from 
  orders  
where 
  amount1>10000

查询未执行,我得到了这个例外:

  

" AMOUNT1"在使用它的上下文中无效.SQLCODE = -206,SQLSTATE = 42703,DRIVER = 3.64.96 SQL代码:-206,SQL状态:42703

我做错了什么?

3 个答案:

答案 0 :(得分:0)

您无法在DB2中同时创建和使用amount1。

试试这个:

lines = pandas.read_csv(fname, comment='#', delimiter=',', header=None)

或者这个:

 select * from (
 select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
 ) tmp where amount1>10000

答案 1 :(得分:0)

此主题已经回答,我的第一个例子是重复的[但格式不同];在我提供的东西中可能会有一些有价值的东西。

分配给SELECT列表上的表达式的名称不可用于同一SELECT查询的每个其他子句的范围中的引用;例如在那里分配的名称可以在ORDER BY子句中引用,但不能在WHERE子句或HAVING子句中引用 - 因此,解释了所看到的错误。

为避免重复HAVING子句中的表达式[注意:除非重写为标量子选择,否则WHERE子句中不允许聚合],考虑为表达式的结果指定名称派生表表达式;这样可以将名称的范围限定为该派生表的查询。通过取消对 重复表达式的引用,如果需要对查询进行任何修订,还可以防止必须以相同方式维护这两个副本。

此处显示的表标识符和限定列名的使用都是可选的,但包括在内以明确引用名称的来源;示例显示了两种编码派生表以引用命名表达式的方法。

select S.AMOUNT1
from table /* Nested Table Expression (NTE) */
  ( select 
      SUM ( orders.totalproduct
          + orders.TOTALTAX
          + orders.totalshipping
          - orders.totaladjustment
          ) as amount1 
    from orders
  ) as S
where S.amount1>10000

with /* Common Table Expression (CTE) */
  aggSum ( AMOUNT1 ) as
    ( select 
         SUM ( orders.totalproduct
             + orders.TOTALTAX
             + orders.totalshipping
             - orders.totaladjustment
             ) as amount1 /* named here; or, as shown, named above */
      from orders
    )
select C.AMOUNT1
from aggSum as C /* from the above (CTE) */
where C.amount1>10000

虽然还有以下选项[我怀疑我会编码,因为],我发现这比在HAVING子句中对表达式进行重复引用要困难得多[即如接受答案中的第二个例子所示]。此查询在子查询中封装相同的聚合查询,然后在WHERE子句中将其作为标量子选择引用:

  select 
    SUM ( orders.totalproduct
        + orders.TOTALTAX
        + orders.totalshipping
        - orders.totaladjustment
        ) as amount1 
  from orders
  where ( select 
            SUM ( orders.totalproduct
                + orders.TOTALTAX
                + orders.totalshipping
                - orders.totaladjustment
                )
          from orders
        ) > 10000

答案 2 :(得分:0)

在db2中,您无法在同一个子查询中使用您为列创建的别名。

即使在MySQL / BigQuery中,我认为你只能通过/ order by / having语句引用组中的任何别名,而不是where。

使用子查询并在那里过滤,或复制列的代码(没有别名)并将其粘贴到where。但是会推荐子查询选项。