Vous ne pouvez pas faire référence à un alias de colonne dans le même niveau de SQL, sauf dans le order by
clause.
À partir de la documentation (soulignement ajouté) :
Vous pouvez utiliser un alias de colonne, c_alias , pour étiqueter l'expression immédiatement précédente dans la liste de sélection afin que la colonne s'affiche avec un nouvel en-tête. L'alias renomme effectivement l'élément de liste de sélection pour la durée de la requête. L'alias peut être utilisé dans le
ORDER BY
clause, mais pas les autres clauses de la requête .
Lorsque vous vous référez à QTYLIV
dans le GROUP BY
Par exemple, la liste de sélection n'a pas encore été évaluée et l'alias n'existe pas. C'est ainsi que la requête est analysée et exécutée.
Lorsque vous avez des expressions compliquées dans la liste de sélection, il est souvent plus simple de les envelopper dans une sélection externe et de faire le regroupement ensuite :
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 ;
Notez que vous n'utilisez pas les alias de table d'origine dans le GROUP BY
ou ORDER BY
clauses dans la sélection externe, car celles-ci ne sont plus dans la portée.