Sql ORA-00904 group by子句中标识符的“无效标识符”
有了compiere数据库,我正在尝试ro show 在两个日期之间。 专栏: 名称 销售数量仓库客户销售 数量销售卖家销售送货员 -总数量 按产品划分的价值营业额 为什么会出现此查询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
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放入子查询,然后将这些子句放入外部查询。