Sie können in derselben SQL-Ebene nicht auf einen Spaltenalias verweisen, außer in order by
Klausel.
Aus der Dokumentation (Hervorhebung hinzugefügt):
Sie können einen Spaltenalias verwenden, c_alias , um den unmittelbar vorangehenden Ausdruck in der Auswahlliste zu beschriften, sodass die Spalte mit einer neuen Überschrift angezeigt wird. Der Alias benennt das Auswahllistenelement effektiv für die Dauer der Abfrage um. Der Alias kann im ORDER BY
verwendet werden -Klausel, aber keine anderen Klauseln in der Abfrage .
Wenn Sie sich auf QTYLIV
beziehen im Feld GROUP BY
Daher wurde die Auswahlliste noch nicht ausgewertet und der Alias existiert nicht. So wird die Abfrage geparst und ausgeführt.
Wenn Sie komplizierte Ausdrücke in der Auswahlliste haben, ist es oft am einfachsten, diese in eine äußere Auswahl zu packen und die Gruppierung danach vorzunehmen:
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 ;
Beachten Sie, dass Sie in GROUP BY
nicht die ursprünglichen Tabellenaliase verwenden oder ORDER BY
Klauseln in der äußeren Auswahl, da diese nicht mehr im Geltungsbereich sind.