sqlcode - sqlstate db2 codes
"AMOUNT1" no es vĂ¡lido en el contexto donde se usa (3)
Este tema fue respondido desde entonces, y mi primer ejemplo es un duplicado [pero con un formato diferente]; puede haber algo de valor / agregar en lo que ofrezco.
El nombre asignado a una expresión en la lista de columnas SELECT no está disponible para referencia dentro del alcance de cualquier otra cláusula de la misma consulta SELECT; por ejemplo, el nombre asignado allí, está disponible para referencia en una cláusula ORDER BY, pero no puede ser referencia en una cláusula WHERE o cláusula HAVING, por lo tanto, explica el error visto.
Para evitar repetir la expresión en la cláusula HAVING [señalando: el agregado no está permitido en una cláusula WHERE a menos que se reescriba como una subselección escalar], considere asignar un nombre al resultado de la expresión dentro de una expresión de tabla derivada ; que habilita el alcance del nombre en la consulta de esa tabla derivada. Al eliminar la referencia a una expresión duplicada , eso también evita tener que mantener las dos copias de manera idéntica, si es necesario realizar alguna revisión a la consulta.
El identificador de tabla y el uso del nombre de columna calificado que se muestra aquí son ambos opcionales, pero se incluyen para aclarar de dónde proviene el nombre referenciado; los ejemplos muestran dos formas de codificar una tabla derivada para hacer referencia a la expresión nombrada.
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
Aunque también existe la siguiente opción [una que dudo que alguna vez codifique, porque], encuentro esto mucho más difícil de leer que haber hecho referencias duplicadas a la expresión en la cláusula HAVING [es decir, como se muestra en el segundo ejemplo en la respuesta aceptada]. Esta consulta encapsula la misma consulta agregada en una subconsulta ya que a continuación se hace referencia a ella como una subselección escalar en la cláusula 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
Estoy ejecutando la siguiente consulta en DB2:
select
SUM (orders.totalproduct
+orders.TOTALTAX
+orders.totalshipping
-orders.totaladjustment) as amount1
from
orders
where
amount1>10000
La consulta no se ejecuta, obtengo esta excepción en su lugar:
"AMOUNT1" no es válido en el contexto donde se usa .. SQLCODE = -206, SQLSTATE = 42703, DRIVER = 3.64.96 Código SQL: -206, SQL Estado: 42703
¿Qué estoy haciendo mal?
No puede crear y usar amount1 al mismo tiempo en DB2.
Prueba esto:
select * from (
select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders
) tmp where amount1>10000
o esto:
select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders
having SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-orders.totaladjustment)>10000
en db2, no puede usar un alias que haya creado para sus columnas en la misma sub consulta para el where / having.
Incluso en MySQL / BigQuery, creo que solo puede hacer referencia a cualquier alias en el grupo por / orden por / teniendo declaraciones, no el dónde.
Utilice una consulta secundaria y filtre allí, o copie el código de la columna (SIN el alias) y péguelo en where. Pero recomendaría la opción de sub consulta.