oracle查询选择语句——count、sum、order by、group by

Posted

技术标签:

【中文标题】oracle查询选择语句——count、sum、order by、group by【英文标题】:Oracle query select statement - count, sum, order by, group by 【发布时间】:2016-02-17 03:12:07 【问题描述】:

我正在尝试一个我什至无法理解的 Oracle SQL 家庭作业...有人可以帮帮我吗?我在 SQL 方面不是一个完全的菜鸟,但这似乎太复杂了,我无法理解。

提示是: 编写一个 SELECT 语句,为每个包含三列的总帐帐号返回一行: General_Ledger_accounts 表中的 account_description 列 Invoice_Line_Items 表中具有相同 account_number 的条目的计数 Invoice_Line_Items 表中具有相同 account_number 的行项目金额的总和 过滤结果集以仅包含计数大于 1 的那些行;按帐户描述对结果集进行分组(我假设它们的意思是 Account_Description);并按订单项金额之和对结果集进行降序排序。

表格详情

SQL> desc general_ledger_accounts
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ACCOUNT_NUMBER                            NOT NULL NUMBER
 ACCOUNT_DESCRIPTION                       NOT NULL VARCHAR2(50)

【问题讨论】:

您能告诉我们您尝试的查询无效吗? 其实我还没有开始,因为我不知道从哪里开始。我确实问过提供这个的同学,但它在 count(distinct invoice_line_items.account_number) 列中返回值 61482。 select general_ledger_accounts.account_description, count(DISTINCT invoice_line_items.account_number), sum(invoice_line_items.account_number) from general_ledger_accounts, invoice_line_items group by general_ledger_accounts.account_description HAVING count(DISTINCT invoice_line_items.account_number) > 1 order by count(DISTINCT invoice_line_items.account_number) desc; 【参考方案1】:

首先,在您的FROM 子句中,您需要使用GENERAL_LEDGER_ACCOUNTS.ACCOUNT_NUMBER = INVOICE_LINE_ITEMS.ACCOUNT_NUMBER 的条件将GENERAL_LEDGER_ACCOUNTS 表与INVOICE_LINE_ITEMS 表连接起来。

然后(在此之上),在您的 SELECT 子句中,指明您需要的 3 列。

您不需要WHERE 子句,因为您正在考虑所有行。

使用GROUP BY 子句指示您要聚合的列。由于您想要每个 ACCOUNT_NUMBER 的聚合(COUNTSUM),那么您只需要 ACCOUNT_NUMBER 在您的 GROUP BY 中。

接下来,使用HAVING 过滤组。在您的情况下,您希望将HAVINGCOUNT 分组到某个阈值以上。

最后,使用ORDER BY按照SUMDESC结束顺序中对组进行排序。

* 剧透:先尝试自己解决*

SELECT gla.account_description, count(*), sum(ili.line_item_amount)
FROM   general_ledger_accounts gla
INNER JOIN invoice_line_items ili ON ili.account_number = gla.account_number
GROUP BY gla.account_description
HAVING count(*) > 1
ORDER BY SUM(ili.line_item_amount) DESC

【讨论】:

谢谢!只是几个问题,既然我们说“FROM gla”,“count(*)”怎么知道只计算来自 ili 的条目? 'inner join' 和 'join' 和有什么不一样?两者似乎都以相同的方式工作。也许我应该接受提示,一次只做一份。我只是被它淹没了。 COUNT(*) 计算每个组中的记录总数。我假设ACCOUNT_NUMBERGENERAL_LEDGER_ACCOUNTS 中的主键。因此,GENERAL_LEDGER_ACCOUNTS 中只能有 1 个帐户,ACCOUNT_NUMBER,例如 1234。假设有 6 个 ili 行具有相同的帐号。然后,glaili 之间的连接将产生 6 行,帐号为 1234。如果有可能,例如,gla 中有 2 个帐号,帐号为 1234,那么连接将产生 2x6 = 12 行(我的查询不正确)。但这就是为什么你总是有一个...... 一个表中的外键转到另一个表中的唯一键(希望是主键)...以避免这种 2x6 类型的情况(称为叉积的笛卡尔积)。跨度> JOININNER JOIN 之间没有区别。默认情况下,JOININNER JOIN,这与 OUTER JOIN 不同,您稍后肯定会了解。 马修,我感激不尽。这很清楚,我实际上理解它。

以上是关于oracle查询选择语句——count、sum、order by、group by的主要内容,如果未能解决你的问题,请参考以下文章

查询分组中的 Oracle SQL 条件聚合函数

在Oracle中,想通过查询语句得出结果集,获得该结果集的表头。

Oracle 中 CASE WHEN 语句中的 SUM

Oracle SQL Count 或 Sum 以防万一查询?

oracle 中 sum 如何使用,

ORACLE 语句