Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-00904 Identificatore non valido” per un identificatore in una clausola group by

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.