oracle在sql中使用groupby语句时的问题

bfrts1fy  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(381)

我无法按所有值相同但有两行的表分组。我不明白这背后的原因是什么。
运行完这个查询后,我得到了下面的表,我想把表按批号分组。

SELECT 
  c.LOT_NO LOT_NO
, (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) NON_ZERO_QTY
, count(c.lot_no) over () as LOT_COUNT
FROM 
 CIM.QLDT_6001 a 
, CIM.PART_LOT_TBL b 
, CIM.JR_QTY_DETAIL_TBL c 
WHERE 
c.lot_no = 'F-AJR-111026-603'
AND 
a.val01 >= 100 
AND 
b.lot_no = c.lot_no
AND 
a.lot_no like '%' || b.old_lot_no || '%'

表格:

LOT_NO       NON_ZERO_QTY  LOT_COUNT
F-AJR-111026-603      3             2
F-AJR-111026-603      3             2

现在当我试着用抽签来分组时,我得到了下面的错误。

ORA-00918: column ambiguously defined
00918. 00000 -  "column ambiguously defined"

* Cause:
* Action:

Error at Line: 19 Column: 10

我还尝试从select语句中获取所有列,但出现了以下错误

ORA-00904: "LOT_COUNT": invalid identifier
00904. 00000 -  "%s: invalid identifier"

* Cause:
* Action:

Error at Line: 19 Column: 34

我完全搞不清楚发生了什么事。有人能帮忙吗。

rqcrx0a6

rqcrx0a61#

您的查询中存在多个问题。 group by c.lot_no 是必需的
中的第二个表达式 SELECT 一定要包在里面 SUM 聚合函数(更改的表达式 CASE 报表(按要求)
始终使用标准ansi连接((推荐)
检查以下解决方案:

SELECT 
  c.LOT_NO LOT_NO
, SUM(CASE WHEN (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) > 0 
        THEN 1 ELSE 0 END) NON_ZERO_QTY
, count(c.lot_no) as LOT_COUNT
FROM 
 CIM.QLDT_6001 a 
JOIN CIM.PART_LOT_TBL b ON a.lot_no like '%' || b.old_lot_no || '%'
JOIN CIM.JR_QTY_DETAIL_TBL c ON b.lot_no = c.lot_no 
WHERE 
c.lot_no = 'F-AJR-111026-603'
AND a.val01 >= 100 
GROUP BY c.LOT_NO
izkcnapc

izkcnapc2#

据我所知,你不能 Group ByLOT_No 或者 LOT_COUNT 并获取标识符错误。这可能是因为没有对列使用正确的引用。相反,请尝试将查询的特定表引用用作:

SELECT 
  c.LOT_NO LOT_NO
, (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) NON_ZERO_QTY
, count(c.lot_no) over () as LOT_COUNT
FROM 
 CIM.QLDT_6001 a 
, CIM.PART_LOT_TBL b 
, CIM.JR_QTY_DETAIL_TBL c 
GROUP BY c.LOT_NO;

另请参阅:https://www.techonthenet.com/oracle/errors/ora00904.php 而且,http://www.dba-oracle.com/t_ora_00918_column_ambiguously_defined.htm
更新:
确保您正在对select语句中选定的列进行分组。
出错后:

SELECT 
  c.LOT_NO LOT_NO
, MAX(4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) NON_ZERO_QTY
, count(c.lot_no) over () as LOT_COUNT
FROM 
 CIM.QLDT_6001 a 
, CIM.PART_LOT_TBL b 
, CIM.JR_QTY_DETAIL_TBL c 
GROUP BY c.LOT_NO;

请注意中使用的max函数 NON_ZERO_QTY 声明。您可以根据您的要求使用任何其他此类功能。它可以是sum()、min()、avg()等。

jogvjijk

jogvjijk3#

你的错误

ORA-00918: column ambiguously defined

表示在查询的多个表中找到要按其分组的列。您需要做的是在它前面加上正确表的别名。

group by c.LOT_NO

但这会给你另一个错误

ORA-00979: not a GROUP BY expression

因为select子句中的第二行没有group函数。乍一看,您正在查找sum()。但这取决于你们的用例。

(4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) NON_ZERO_QTY

例子:

SUM( (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0)))) NON_ZERO_QTY

相关问题