Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-00904 Identificador inválido” para um identificador em uma cláusula group by


Você não pode fazer referência a um alias de coluna no mesmo nível de SQL, exceto na order by cláusula.

Da documentação (grifo nosso):

Você pode usar um alias de coluna, c_alias , para rotular a expressão imediatamente anterior na lista de seleção para que a coluna seja exibida com um novo título. O alias renomeia efetivamente o item da lista de seleção durante a consulta. O alias pode ser usado no ORDER BY cláusula, mas não outras cláusulas na consulta .

Quando você se refere a QTYLIV no GROUP BY cluase que a lista de seleção ainda não foi avaliada e o alias não existe. É assim que a consulta é analisada e executada.

Quando você tem expressões complicadas na lista de seleção, geralmente é mais simples envolver isso em uma seleção externa e fazer o agrupamento depois:
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 ;

Observe que você não usa os aliases de tabela originais no GROUP BY ou ORDER BY cláusulas na seleção externa, pois não estão mais no escopo.