SQL:当一列有最大/计数子查询时,我可以用多列编写查询吗?

时间:2021-07-05 08:54:41

标签: sql oracle group-by subquery

这里是初学者。我已经写了下面的 SQL 语句并且返回记录没有问题。

SELECT COUNT(MAX(doc_line_num)) AS "TOTAL RECS"
FROM C_LAB
WHERE COMP_CODE = 'P1' AND OP_CODE = 'RMARTINEZ'
GROUP BY DOC_NUM

我的问题是.. 我可以用多列编写相同的查询吗?例如:

SELECT OP_CODE, COUNT(MAX(doc_line_num)) AS "TOTAL REC"
FROM C_LAB
WHERE COMP_CODE = 'P1' AND OP_CODE = 'CHRISTIANMONTALVO'
GROUP BY OP_CODE, DOC_NUM

我收到以下错误:

<块引用>

SQL 错误 [937] [42000]:ORA-00937:不是单组组函数

这不可能吗?还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,您使用的是 Oracle 提供的快捷方式。这个

SELECT COUNT(MAX(doc_line_num)) AS "TOTAL RECS"
FROM c_lab
WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ'
GROUP BY doc_num;

相当于

SELECT COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ'
  GROUP BY doc_num
);

并最终计算具有 doc_line_num 的 doc num。

你也可以把它写成

SELECT COUNT(DISTINCT doc_num) AS "TOTAL RECS"
FROM c_lab
WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ' AND doc_line_num IS NOT NULL;

您的第二个查询相当于

SELECT op_code, COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT op_code, doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'CHRISTIANMONTALVO'
  GROUP BY op_code, doc_num
);

这是无效的,因为在主查询中您聚合 (COUNT(max_doc_line_num)),但也选择了缺少 GROUP BY 子句或聚合的 op_code。

说到这里,你可能正在寻找这个:

SELECT op_code, COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT op_code, doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'CHRISTIANMONTALVO'
  GROUP BY op_code, doc_num
)
GROUP BY op_code
ORDER BY op_code;

但也许您想要完全不同的东西。我不知道。我的建议:不要使用 Oracle 的快捷方式在不使用子查询的情况下再次聚合所有聚合行。使用子查询,意图明确,不会发生这样的语法错误。

相关问题