我在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
我做错了什么?
答案 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。但是会推荐子查询选项。