Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-00904 "Identifiant invalide" pour un identifiant dans une clause group by

Vous ne pouvez pas faire référence à un alias de colonne dans le même niveau de SQL, sauf dans le order by clause.

À partir de la documentation (soulignement ajouté) :

Vous pouvez utiliser un alias de colonne, c_alias , pour étiqueter l'expression immédiatement précédente dans la liste de sélection afin que la colonne s'affiche avec un nouvel en-tête. L'alias renomme effectivement l'élément de liste de sélection pour la durée de la requête. L'alias peut être utilisé dans le ORDER BY clause, mais pas les autres clauses de la requête .

Lorsque vous vous référez à QTYLIV dans le GROUP BY Par exemple, la liste de sélection n'a pas encore été évaluée et l'alias n'existe pas. C'est ainsi que la requête est analysée et exécutée.

Lorsque vous avez des expressions compliquées dans la liste de sélection, il est souvent plus simple de les envelopper dans une sélection externe et de faire le regroupement ensuite :

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 ;

Notez que vous n'utilisez pas les alias de table d'origine dans le GROUP BY ou ORDER BY clauses dans la sélection externe, car celles-ci ne sont plus dans la portée.