2

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

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 未能说明它不是按表达式分组。

任何人都可以通过一些解释帮助我理解如何正确获取第二个查询吗?

4

3 回答 3

2

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

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

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

于 2012-10-03T09:53:12.137 回答
1

可能您的问题在于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

在这里您可以找到更多信息。

于 2012-10-03T10:03:23.913 回答
1

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

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

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

于 2012-10-03T10:11:06.610 回答