Sql ORA-00904 group by子句中标识符的“无效标识符”

Sql ORA-00904 group by子句中标识符的“无效标识符”,sql,oracle,compiler-errors,Sql,Oracle,Compiler Errors,有了compiere数据库,我正在尝试ro show 在两个日期之间。 专栏: 名称 销售数量仓库客户销售 数量销售卖家销售送货员 -总数量 按产品划分的价值营业额 为什么会出现此查询 SELECT p.name AS design, p.M_PRODUCT_CATEGORY_ID, il.PRICEACTUAL AS price, bp.C_BPARTNER_ID AS idpartner, CASE WHEN i.IsReturnTrx = 'N' THE

有了compiere数据库,我正在尝试ro show

在两个日期之间。

专栏:

名称

销售数量仓库客户销售

数量销售卖家销售送货员 -总数量

按产品划分的价值营业额

为什么会出现此查询

SELECT p.name AS design,
  p.M_PRODUCT_CATEGORY_ID,
  il.PRICEACTUAL   AS price,
  bp.C_BPARTNER_ID AS idpartner,
  CASE
    WHEN i.IsReturnTrx = 'N'
    THEN SUM(il.linenetamt)
    ELSE SUM(il.linenetamt)*-1
  END AS netHT,
  CASE
    WHEN i.IsReturnTrx = 'N'
    THEN SUM((il.linenetamt + (il.linenetamt * t.rate /100)))
    ELSE SUM((il.linenetamt + (il.linenetamt * t.rate /100)))*-1
  END AS netTTC,
  (SELECT il.qtyinvoiced
  FROM C_InvoiceLine il
  WHERE bp.ISCUSTOMER ='Y'
  AND bp.ISACTIVE     ='Y'
  AND bp.C_BPARTNER_ID= 19999
  )              AS qtydepot,
  (SELECT qtyinvoiced
  FROM C_InvoiceLine il
  WHERE bp.ISCUSTOMER ='Y'
  AND bp.C_BPARTNER_ID= 18888
  )               AS qtyliv,
  org.description AS orgname,
  loc2.address1,
  loc2.address2,
  loc2.address3,
  loc2.address4,
  loc2.city,
  loc2.postal,
  oi.phone,
  oi.phone2,
  oi.fax,
  i.DATEINVOICED AS dat
FROM C_InvoiceLine il
INNER JOIN M_PRODUCT p
ON(p.M_PRODUCT_ID = il.M_PRODUCT_ID)
INNER JOIN C_INVOICE i
ON (i.C_INVOICE_ID = il.C_INVOICE_ID)
INNER JOIN C_BPARTNER bp
ON (bp.C_BPARTNER_ID = i.C_BPARTNER_ID)
INNER JOIN AD_Org org
ON (i.AD_Org_ID = org.AD_Org_ID)
INNER JOIN C_Tax t
ON (t.C_Tax_ID = il.C_Tax_ID)
INNER JOIN ad_orginfo oi
ON (org.ad_org_id=oi.ad_org_id)
INNER JOIN c_location loc2
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 p.name ,
  p.M_PRODUCT_CATEGORY_ID,
  il.QTYINVOICED,
  il.PRICEACTUAL,
  i.DATEINVOICED,
  bp.C_BPARTNER_ID,
  org.description,
  loc2.address1,
  loc2.address2,
  loc2.address3,
  loc2.address4,
  loc2.city,
  loc2.postal,
  oi.phone,
  oi.phone2,
  oi.fax,
  i.IsReturnTrx,
  i.dateinvoiced,
  qtyliv,
  qtydepot
ORDER BY p.name ,
  i.dateinvoiced ;
告诉我这个错误:

ORA-00904: "QTYLIV" : identificateur non valide
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Erreur à la ligne 75, colonne 3

除order by子句外,不能在同一级别的SQL中引用列别名

重点补充:

您可以使用列别名c_alias来标记select列表中紧挨着前面的表达式,以便以新标题显示该列。该别名在查询期间有效地重命名select列表项。该别名可用于ORDER BY子句,但不能用于查询中的其他子句

当您在GROUP BY CLUSE中引用QTYLIV时,选择列表尚未计算且别名不存在。这正是解析和执行查询的方式

当选择列表中有复杂的表达式时,通常最简单的方法是将其包装在外部选择中,然后进行分组:

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 ;

请注意,在外部select中的GROUP BY或ORDER BY子句中不使用原始表别名,因为这些别名已不在范围内。

问题至少在GROUP BY子句中存在。Oracle不允许GROUP BY中使用列别名。您可以通过子查询轻松解决此问题:

select t.*
from (select . . .
      from . . .
      where . . .
     ) t
group by . . . 
order by . . . ;

换句话说,将除group by和order by之外的所有内容都放在子查询中。然后将这些子句放在外部查询中。

您可以尝试最小化SQL,以便查看错误的来源吗?问题在这里,请从C_InvoiceLine il中选择il.QTY,其中bp.ISCUSTOMER='Y'和bp.ISACTIVE='Y'以及bp.C_BPARTNER\u ID=19999作为qtydepot,从C_InvoiceLine il中选择QTYVoiced,其中bp.ISCUSTOMER='Y'和bp.C_BPARTNER_ID=18888作为qtyliv,错误报告在第75行,即当您在GROUP BY中引用qtyliv时,而不是在该子查询本身中。如果您可以编辑代码并将其提供给meDoes,我将无法执行此操作。请回答您的问题uestion?您的意思是从C_InvoiceLine il中选择il.qtyVoiced,其中bp.ISCUSTOMER='Y'和bp.C_BPARTNER_ID=18888,并将il.qtyVoiced设置为qtyliv、@mugiwaradz…我不确定您的评论是什么意思。AS qtyliv定义了一个名为qtyliv的列别名。您不能在group by子句中直接使用它。因此,将原始查询减去group by和order by放入子查询,然后将这些子句放入外部查询。