sql >> Database >  >> RDS >> Oracle

ORA-00904 Ongeldige identifier” voor een identifier in een group by-clausule

U kunt niet verwijzen naar een kolomalias in hetzelfde SQL-niveau, behalve in de order by clausule.

Uit de documentatie (nadruk toegevoegd):

U kunt een kolomalias gebruiken, c_alias , om de direct voorafgaande uitdrukking in de selectielijst te labelen, zodat de kolom wordt weergegeven met een nieuwe kop. De alias hernoemt effectief het geselecteerde lijstitem voor de duur van de query. De alias kan worden gebruikt in de ORDER BY clausule, maar geen andere clausules in de zoekopdracht .

Wanneer u verwijst naar QTYLIV in de GROUP BY cluase de selectielijst is nog niet geëvalueerd en de alias bestaat niet. Dit is precies hoe de query wordt geparseerd en uitgevoerd.

Als je ingewikkelde uitdrukkingen in de selectielijst hebt, is het vaak het eenvoudigst om die in een buitenste selectie te plaatsen en daarna te groeperen:

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 ;

Merk op dat u niet de originele tabelaliassen gebruikt in de GROUP BY of ORDER BY clausules in de buitenste selectie, omdat die niet langer in het bereik zijn.



  1. SQL:Wat is beter een bit of een char(1)

  2. Oracle Fast Recovery Area

  3. T-SQL:Rond af op het dichtstbijzijnde interval van 15 minuten

  4. Een Bastion-server verbinden met een PostgreSQL-server via SSH-tunnel