sql >> Base de Datos >  >> RDS >> Oracle

ORA-00904 Identificador no válido” para un identificador en una cláusula group by

No puede hacer referencia a un alias de columna en el mismo nivel de SQL, excepto en el order by cláusula.

De la documentación (énfasis agregado):

Puede usar un alias de columna, c_alias , para etiquetar la expresión inmediatamente anterior en la lista de selección para que la columna se muestre con un nuevo encabezado. El alias cambia efectivamente el nombre del elemento de la lista de selección durante la consulta. El alias se puede utilizar en ORDER BY cláusula, pero no otras cláusulas en la consulta .

Cuando se refiere a QTYLIV en el GROUP BY cluase la lista de selección aún no ha sido evaluada y el alias no existe. Así es como se analiza y ejecuta la consulta.

Cuando tiene expresiones complicadas en la lista de selección, a menudo es más simple envolver eso en una selección externa y hacer la agrupación después:

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 ;

Tenga en cuenta que no usa los alias de la tabla original en GROUP BY o ORDER BY cláusulas en la selección externa, ya que ya no están dentro del alcance.