在SQL中有没有更简洁的方法来运行这个查询?
Is there a more concise way to run this query in SQL?
我正在使用一组示例数据学习 MySQL 中的子查询和聚合。我有两个 table,orders
和 agents
。这是每个 table:
的一部分
订单:
+---------+------------+----------------+------------+-----------+------------+-----------------+
| 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 为印度、U.K、澳大利亚等的代理商的总和 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 |
+-----------+---------------+
我对这个结果很满意:这是我所期望的,并且实现了我的 objective。
我的问题是:我能做些什么来使这个查询更整洁或更简洁吗?
感觉查询很长,我不确定我是否没有利用更简单或更容易的方法。
一级聚合就足够了:
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;
我正在使用一组示例数据学习 MySQL 中的子查询和聚合。我有两个 table,orders
和 agents
。这是每个 table:
订单:
+---------+------------+----------------+------------+-----------+------------+-----------------+
| 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 为印度、U.K、澳大利亚等的代理商的总和 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 |
+-----------+---------------+
我对这个结果很满意:这是我所期望的,并且实现了我的 objective。
我的问题是:我能做些什么来使这个查询更整洁或更简洁吗?
感觉查询很长,我不确定我是否没有利用更简单或更容易的方法。
一级聚合就足够了:
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;