如何在以下场景中使用 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
之后(因此,在HAVING
、ORDER BY
和SELECT
部分中),表达式必须基于 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的主要内容,如果未能解决你的问题,请参考以下文章