Você não pode fazer referência a um alias de coluna no mesmo nível de SQL, exceto na
order by
cláusula. Da documentação (grifo nosso):
Você pode usar um alias de coluna, c_alias , para rotular a expressão imediatamente anterior na lista de seleção para que a coluna seja exibida com um novo título. O alias renomeia efetivamente o item da lista de seleção durante a consulta. O alias pode ser usado noORDER BY
cláusula, mas não outras cláusulas na consulta .
Quando você se refere a
QTYLIV
no GROUP BY
cluase que a lista de seleção ainda não foi avaliada e o alias não existe. É assim que a consulta é analisada e executada. Quando você tem expressões complicadas na lista de seleção, geralmente é mais simples envolver isso em uma seleção externa e fazer o agrupamento depois:
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 ;
Observe que você não usa os aliases de tabela originais no
GROUP BY
ou ORDER BY
cláusulas na seleção externa, pois não estão mais no escopo.