No puede hacer referencia a un alias de columna en el mismo nivel de SQL, excepto en el order by
cláusula.
De la documentación (énfasis agregado):
Puede usar un alias de columna, c_alias , para etiquetar la expresión inmediatamente anterior en la lista de selección para que la columna se muestre con un nuevo encabezado. El alias cambia efectivamente el nombre del elemento de la lista de selección durante la consulta. El alias se puede utilizar en ORDER BY
cláusula, pero no otras cláusulas en la consulta .
Cuando se refiere a QTYLIV
en el GROUP BY
cluase la lista de selección aún no ha sido evaluada y el alias no existe. Así es como se analiza y ejecuta la consulta.
Cuando tiene expresiones complicadas en la lista de selección, a menudo es más simple envolver eso en una selección externa y hacer la agrupación después:
SELECT *
FROM (
SELECT p.name AS design,
p.M_PRODUCT_CATEGORY_ID,
il.PRICEACTUAL AS price,
bp.C_BPARTNER_ID AS idpartner,
CASE
...
(SELECT qtyinvoiced
FROM C_InvoiceLine il
WHERE bp.ISCUSTOMER ='Y'
AND bp.C_BPARTNER_ID= 18888
) AS qtyliv,
...
i.DATEINVOICED AS dat
FROM C_InvoiceLine il
INNER JOIN M_PRODUCT p
...
ON (oi.c_location_id=loc2.c_location_id)
--WHERE i.DateInvoiced BETWEEN $P{Date1} AND $P{Date2}
--AND
--i.DocStatus in ('CO','CL')
--AND i.IsSoTrx = 'Y'
--AND p.isstocked='Y'
)
GROUP BY name ,
M_PRODUCT_CATEGORY_ID,
QTYINVOICED,
PRICEACTUAL,
...
qtyliv,
qtydepot
ORDER BY name ,
dateinvoiced ;
Tenga en cuenta que no usa los alias de la tabla original en GROUP BY
o ORDER BY
cláusulas en la selección externa, ya que ya no están dentro del alcance.