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
的聚合(COUNT
和 SUM
),那么您只需要 ACCOUNT_NUMBER
在您的 GROUP BY
中。
接下来,使用HAVING
过滤组。在您的情况下,您希望将HAVING
和COUNT
分组到某个阈值以上。
最后,使用ORDER BY
按照SUM
在DESC
结束顺序中对组进行排序。
* 剧透:先尝试自己解决*
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_NUMBER
是GENERAL_LEDGER_ACCOUNTS
中的主键。因此,GENERAL_LEDGER_ACCOUNTS
中只能有 1 个帐户,ACCOUNT_NUMBER
,例如 1234。假设有 6 个 ili
行具有相同的帐号。然后,gla
和 ili
之间的连接将产生 6 行,帐号为 1234。如果有可能,例如,gla
中有 2 个帐号,帐号为 1234,那么连接将产生 2x6 = 12 行(我的查询不正确)。但这就是为什么你总是有一个......
一个表中的外键转到另一个表中的唯一键(希望是主键)...以避免这种 2x6 类型的情况(称为叉积的笛卡尔积)。跨度>
JOIN
和 INNER JOIN
之间没有区别。默认情况下,JOIN
是 INNER JOIN
,这与 OUTER JOIN
不同,您稍后肯定会了解。
马修,我感激不尽。这很清楚,我实际上理解它。以上是关于oracle查询选择语句——count、sum、order by、group by的主要内容,如果未能解决你的问题,请参考以下文章
在Oracle中,想通过查询语句得出结果集,获得该结果集的表头。