Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00904 Ungültiger Bezeichner“ für einen Bezeichner in einer „group by“-Klausel

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.