繁体   English   中英

如何修复错误:SQL 错误 [904] [42000]:ORA-00904:“SPAREBOX”:标识符无效

[英]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

然后我使用WITHGROUP 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM