【问题标题】:SQL: Can I write query with multiple columns when one column has a max/count subquery?SQL:当一列有最大/计数子查询时,我可以编写多列查询吗?
【发布时间】:2021-09-16 01:36:42
【问题描述】:

这里是初学者。我写了如下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: 不是单组分组函数

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

【问题讨论】:

    标签: sql oracle group-by subquery


    【解决方案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 的文档编号。

    你也可以这样写

    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 的快捷方式在不使用子查询的情况下再次聚合所有聚合行。使用子查询,意图明确,不会发生此类语法错误。

    【讨论】:

    • 我非常感谢您的详细回复。这就是我一直在寻找的。​​span>
    猜你喜欢
    • 2019-08-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2020-09-18
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多