Non puoi fare riferimento a un alias di colonna nello stesso livello di SQL, tranne che in order by
clausola.
Dalla documentazione (enfasi aggiunta):
Puoi utilizzare un alias di colonna, c_alias , per etichettare l'espressione immediatamente precedente nell'elenco di selezione in modo che la colonna venga visualizzata con una nuova intestazione. L'alias rinomina in modo efficace l'elemento dell'elenco di selezione per la durata della query. L'alias può essere utilizzato in ORDER BY
clausola, ma non altre clausole nella query .
Quando fai riferimento a QTYLIV
nel GROUP BY
quindi l'elenco di selezione non è stato ancora valutato e l'alias non esiste. Questo è solo il modo in cui la query viene analizzata ed eseguita.
Quando hai espressioni complicate nell'elenco di selezione, è spesso più semplice racchiuderlo in una selezione esterna ed eseguire il raggruppamento in seguito:
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 ;
Nota che non utilizzi gli alias di tabella originali in GROUP BY
o ORDER BY
clausole nella selezione esterna, poiché non sono più nell'ambito di applicazione.