如何在以下场景中使用 Oracle Group BY

Posted

技术标签:

【中文标题】如何在以下场景中使用 Oracle Group BY【英文标题】:How to use Oracle Group BY in the below scenario 【发布时间】:2012-10-03 09:46:13 【问题描述】:

下面是一个非常基本的场景。

即使经过大量示例,我也很难理解 GROUP BY 的工作原理。

在以下场景中,我需要获取日期的最小值,并且需要将我的查询 1 转换为查询 2。

查询1:

SELECT b.aper07_req_created_s,
       b.aper06_req_status_k,
       a.aper06_req_status_x
FROM   iaper07_employee_offbrd_req b,
       iaper06_req_status a
WHERE  a.aper06_req_status_k = b.aper06_req_status_k
       AND b.aper07_req_k = 3387
       AND b.aper06_req_status_k = 4
ORDER  BY b.aper07_req_created_s 

查询 2:

SELECT Min(b.aper07_req_created_s),
       b.aper06_req_status_k,
       a.aper06_req_status_x
FROM   iaper07_employee_offbrd_req b,
       iaper06_req_status a
WHERE  a.aper06_req_status_k = b.aper06_req_status_k
       AND b.aper07_req_k = 3387
       AND b.aper06_req_status_k = 4
GROUP  BY b.aper06_req_status_k,
          a.aper06_req_status_x
ORDER  BY b.aper07_req_created_s 

查询 2 未能说明它不是按表达式分组。

谁能帮助我理解如何通过一些解释正确地进行第二次查询?

【问题讨论】:

你能把你的SQL标记为代码,然后分成多行吗?演示很重要,它将使其更具可读性(因此对于任何可能想要帮助您的人来说更容易理解) 【参考方案1】:

在您的查询 2 中,ORDER BY 子句无效。

GROUP BY 之后(因此,在HAVINGORDER BYSELECT 部分中),表达式必须基于 GROUP-BY 列、常量或其他的聚合函数列。

您可以改用ORDER BY MIN(b.aper07_req_created_s)

【讨论】:

现在我发现我必须在其中包含“AND b.aper06_req_status_k = 4”,因为此列是 group by 的一部分。【参考方案2】:

可能你的问题出在ORDER BY b.aper07_req_created_s,尝试将其替换为:

按最小值排序(b.aper07_req_created_s):

  SELECT Min(b.aper07_req_created_s),
           b.aper06_req_status_k,
           a.aper06_req_status_x
    FROM   iaper07_employee_offbrd_req b,
           iaper06_req_status a
    WHERE  a.aper06_req_status_k = b.aper06_req_status_k
           AND b.aper07_req_k = 3387
           AND b.aper06_req_status_k = 4
    GROUP  BY b.aper06_req_status_k,
              a.aper06_req_status_x
    ORDER  BY Min(b.aper07_req_created_s)

按 1 排序:

 SELECT Min(b.aper07_req_created_s),
           b.aper06_req_status_k,
           a.aper06_req_status_x
    FROM   iaper07_employee_offbrd_req b,
           iaper06_req_status a
    WHERE  a.aper06_req_status_k = b.aper06_req_status_k
           AND b.aper07_req_k = 3387
           AND b.aper06_req_status_k = 4
    GROUP  BY b.aper06_req_status_k,
              a.aper06_req_status_x
    ORDER  BY 1

你也可以使用别名:

    SELECT Min(b.aper07_req_created_s) minemp,
           b.aper06_req_status_k,
           a.aper06_req_status_x
    FROM   iaper07_employee_offbrd_req b,
           iaper06_req_status a
    WHERE  a.aper06_req_status_k = b.aper06_req_status_k
           AND b.aper07_req_k = 3387
           AND b.aper06_req_status_k = 4
    GROUP  BY b.aper06_req_status_k,
              a.aper06_req_status_x
    ORDER  BY minemp

Here你可以找到更多信息。

【讨论】:

【参考方案3】:

尝试解释GROUP BY 在 SQL 中的工作原理: (我会说)它的工作方式与您期望的完全相同。 如果你有一篮子水果,并且你想通过分组类型来计算你拥有的所有水果,你会这样做:

SELECT groupingType, count(groupingType)
FROM fruitBasket
GROUP BY groupingType

如果您使用水果类型(苹果、梨...)作为分组类型,那么您将无法在结果中获得水果颜色,因为它们(苹果、梨...)可能具有不同的颜色。同样,如果你按颜色分组,你将无法获得水果类型......

【讨论】:

以上是关于如何在以下场景中使用 Oracle Group BY的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库GROUP BY 子句

Oracle SQL查询到GROUP BY并减去?

需要在oracle中使用group by查询并计算以下内容

group by 拓展

对于以下场景,如何在 oracle sql 中执行类似 unpivot 的操作?

如何在 Rails 中使用 GROUP_CONCAT?