![](/img/trans.png)
[英]SQL Error: 904, SQLState: 42000 ORA-00904: : invalid identifier
[英]How to fix the error: SQL Error [904] [42000]: ORA-00904: “SPAREBOX”: invalid identifier
我正在使用 SQL 并希望计算总和如下:
具有列和值的表 LOG0055D:
DELVRY_NO ITM_NAME TOTAL_QUANTITY PACKING_STYLE QUANTITY_IN_FULL_CTN
DVR20101900006 CHP-671R 61 30 60
我的食谱:
FULLBOX = TOTAL_QUANTITY/PACKING_STYLE (only get integer)
SPAREBOX = TOTAL_QUANTITY - QUANTITY_IN_FULL_CTN
=> TOTALBOX = FULLBOX + SPAREBOX
我的查询:
SELECT
L55.DELVRY_NO
, L55.ITM_NAME
, L55.TOTAL_QUANTITY
, L55.PACKING_STYLE
, L55.QUANTITY_IN_FULL_CTN
, SUM(L55.TOTAL_QUANTITY/L55.PACKING_STYLE) AS FULLBOX
, SUM(L55.TOTAL_QUANTITY - L55.QUANTITY_IN_FULL_CTN) AS SPAREBOX
, SUM(FULLBOX + SPAREBOX) AS TOTALBOX
FROM LOG0055D L55
当我运行它时发生错误:
SQL Error [904] [42000]: ORA-00904: "SPAREBOX": invalid identifier
SQL Error [937] [42000]: ORA-00937: not a single-group group function
如何解决问题? 非常感谢
您在查询中有多个错误。 一是在定义它的同一SELECT
中对列别名的引用。 二是缺少GROUP BY
。
所以我推测你真的想要:
SELECT L55.DELVRY_NO, L55.ITM_NAME,
SUM(L55.TOTAL_QUANTITY / L55.PACKING_STYLE) AS FULLBOX,
SUM(L55.TOTAL_QUANTITY - L55.QUANTITY_IN_FULL_CTN) AS SPAREBOX
(SUM(L55.TOTAL_QUANTITY /L55.PACKING_STYLE) +
SUM(L55.TOTAL_QUANTITY - L55.QUANTITY_IN_FULL_CTN)
) AS TOTALBOX
FROM LOG0055D L55
GROUP BY L55.DELVRY_NO, L55.ITM_NAME;
请注意,我从 SELECT 中删除L55.TOTAL_QUANTITY, L55.PACKING_STYLE, L55.QUANTITY_IN_FULL_CTN
SELECT
。 这些值在聚合函数中使用,因此将它们包含在GROUP BY
中几乎没有意义。
您可能想要使用WITH
(当然,在末尾添加一个GROUP BY
以避免ORA-00937
错误)
我试图根据您发布的内容重现您的表结构:
create table LOG0055D (DELVRY_NO varchar2(100),ITM_NAME varchar2(100),TOTAL_QUANTITY number, PACKING_STYLE number, QUANTITY_IN_FULL_CTN number);
insert into LOG0055D values ('DVR20101900006','CHP-671R',61,30,60);
commit;
SQL> select * from LOG0055D;
DELVRY_NO ITM_NAME TOTAL_QUANTITY PACKING_STYLE QUANTITY_IN_FULL_CTN
--------------- --------------- -------------- ------------- --------------------
DVR20101900006 CHP-671R 61 30 60
然后我使用WITH
和GROUP BY
重写了您的查询
WITH BOXCOUNT AS (
SELECT ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE)) AS FULLBOX
, ROUND(SUM(TOTAL_QUANTITY - QUANTITY_IN_FULL_CTN)) AS SPAREBOX
FROM LOG0055D
)
SELECT
L55.DELVRY_NO
, L55.ITM_NAME
, L55.TOTAL_QUANTITY
, L55.PACKING_STYLE
, L55.QUANTITY_IN_FULL_CTN
, BC.FULLBOX
, BC.SPAREBOX
,SUM(BC.FULLBOX + BC.SPAREBOX) AS TOTALBOX
FROM LOG0055D L55, BOXCOUNT BC
GROUP BY
L55.DELVRY_NO
, L55.ITM_NAME
, L55.TOTAL_QUANTITY
, L55.PACKING_STYLE
, L55.QUANTITY_IN_FULL_CTN
, BC.FULLBOX
, BC.SPAREBOX;
既然你写了,如果我猜对了,你只需要 integer 号码,我已经在WITH
内的两个SUM
中添加了一个ROUND
这是最终结果:
DELVRY_NO ITM_NAME TOTAL_QUANTITY PACKING_STYLE QUANTITY_IN_FULL_CTN FULLBOX SPAREBOX TOTALBOX
--------------- --------------- -------------- ------------- -------------------- ---------- ---------- ----------
DVR20101900006 CHP-671R 61 30 60 2 1 3
以后不能在 select 中使用别名列(fullbox 和sparebox)。 重复用于创建它们的计算以获取总箱
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.