我正在使用一组示例数据来学习MySQL中的子查询和聚合。我有两个表,orders
和agents
。这是每个表的一部分:
订单:
+---------+------------+----------------+------------+-----------+------------+-----------------+
| ORD_NUM | ORD_AMOUNT | ADVANCE_AMOUNT | ORD_DATE | CUST_CODE | AGENT_CODE | ORD_DESCRIPTION |
+---------+------------+----------------+------------+-----------+------------+-----------------+
| 200100 | 1000.00 | 600.00 | 2008-01-08 | C00015 | A003 | SOD |
| 200110 | 3000.00 | 500.00 | 2008-04-15 | C00019 | A010 | SOD |
| 200107 | 4500.00 | 900.00 | 2008-08-30 | C00007 | A010 | SOD |
| 200112 | 2000.00 | 400.00 | 2008-05-30 | C00016 | A007 | SOD |
| 200113 | 4000.00 | 600.00 | 2008-06-10 | C00022 | A002 | SOD |
| 200102 | 2000.00 | 300.00 | 2008-05-25 | C00012 | A012 | SOD |
| 200114 | 3500.00 | 2000.00 | 2008-08-15 | C00002 | A008 | SOD |
| 200122 | 2500.00 | 400.00 | 2008-09-16 | C00003 | A004 | SOD |
| 200118 | 500.00 | 100.00 | 2008-07-20 | C00023 | A006 | SOD |
| 200119 | 4000.00 | 700.00 | 2008-09-16 | C00007 | A010 | SOD |
+---------+------------+----------------+------------+-----------+------------+-----------------+
代理商:
+------------+------------+--------------+------------+--------------+-----------+
| AGENT_CODE | AGENT_NAME | WORKING_AREA | COMMISSION | PHONE_NO | COUNTRY |
+------------+------------+--------------+------------+--------------+-----------+
| A007 | Ramasundar | Bangalore | 0.15 | 077-25814763 | India |
| A003 | Alex | London | 0.13 | 075-12458969 | U.K. |
| A008 | Alford | New York | 0.12 | 044-25874365 | U.S. |
| A011 | Ravi Kumar | Bangalore | 0.15 | 077-45625874 | India |
| A010 | Santakumar | Chennai | 0.14 | 007-22388644 | India |
| A012 | Lucida | San Jose | 0.12 | 044-52981425 | U.S. |
| A005 | Anderson | Brisbane | 0.13 | 045-21447739 | Australia |
| A001 | Subbarao | Bangalore | 0.14 | 077-12346674 | India |
| A002 | Mukesh | Mumbai | 0.11 | 029-12358964 | India |
| A006 | McDen | London | 0.15 | 078-22255588 | U.K. |
| A004 | Ivan | Toronto | 0.15 | 008-22544166 | Canada |
| A009 | Benjamin | Hampshire | 0.11 | 008-22536178 | U.K. |
+------------+------------+--------------+------------+--------------+-----------+
我想回答的问题是:每个代理商所在国家/地区的订单总数是多少? (即,COUNTRY为印度,英国,澳大利亚等国家的代理商的ORD_AMOUNT总和。)
为此,我首先运行查询以按代理对ORD_AMOUNT进行分组:
SELECT o.AGENT_CODE Agent, SUM(o.ORD_AMOUNT) Total, a.COUNTRY
FROM orders o INNER JOIN agents a USING(AGENT_CODE)
GROUP BY Agent ORDER BY Total DESC;
成功生成了以下输出:
+--------+----------+-----------+
| Agent | Total | COUNTRY |
+--------+----------+-----------+
| A010 | 34000.00 | India |
| A002 | 25400.00 | India |
| A004 | 19000.00 | Canada |
| A005 | 15400.00 | Australia |
| A008 | 15000.00 | U.S. |
| A011 | 10000.00 | India |
| A003 | 7000.00 | U.K. |
| A006 | 6000.00 | U.K. |
| A012 | 5800.00 | U.S. |
| A007 | 5000.00 | India |
| A001 | 1600.00 | India |
| A009 | 1000.00 | U.K. |
+--------+----------+-----------+
然后,我将此嵌套为子查询以获得所需的结果:
SELECT oa.Country, SUM(oa.Total) `Country Total` FROM
(SELECT o.AGENT_CODE Agent, SUM(o.ORD_AMOUNT) Total, a.COUNTRY FROM orders o
INNER JOIN agents a USING(AGENT_CODE) GROUP BY Agent) oa
GROUP BY Country ORDER BY `Country Total` DESC;
导致的结果:
+-----------+---------------+
| Country | Country Total |
+-----------+---------------+
| India | 76000.00 |
| U.S. | 20800.00 |
| Canada | 19000.00 |
| Australia | 15400.00 |
| U.K. | 14000.00 |
+-----------+---------------+
我对这个结果感到满意:这是我所期望的,并且实现了我的目标。
我的问题是:我可以做些什么使此查询更简洁或更简洁?
感觉就像是一个漫长的查询,我不确定是否没有利用简单或更简单的方法。
答案 0 :(得分:2)
一个聚合级别就足够了:
select a.country, sum(o.ord_amount) total
from orders o
inner join agents a using(agent_code)
group by a.country
order by total desc;