U kunt niet verwijzen naar een kolomalias in hetzelfde SQL-niveau, behalve in de order by
clausule.
Uit de documentatie (nadruk toegevoegd):
U kunt een kolomalias gebruiken, c_alias , om de direct voorafgaande uitdrukking in de selectielijst te labelen, zodat de kolom wordt weergegeven met een nieuwe kop. De alias hernoemt effectief het geselecteerde lijstitem voor de duur van de query. De alias kan worden gebruikt in de
ORDER BY
clausule, maar geen andere clausules in de zoekopdracht .
Wanneer u verwijst naar QTYLIV
in de GROUP BY
cluase de selectielijst is nog niet geëvalueerd en de alias bestaat niet. Dit is precies hoe de query wordt geparseerd en uitgevoerd.
Als je ingewikkelde uitdrukkingen in de selectielijst hebt, is het vaak het eenvoudigst om die in een buitenste selectie te plaatsen en daarna te groeperen:
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 ;
Merk op dat u niet de originele tabelaliassen gebruikt in de GROUP BY
of ORDER BY
clausules in de buitenste selectie, omdat die niet langer in het bereik zijn.