我想看看哪个国家和地区的销售表现最好。
我有以下order表:
| order_id | amount |
|----------|--------|
| 100 | 1000 |
| 101 | 250 |
| 102 | 120 |
| 103 | 500 |
| 104 | 25 |
| 105 | 2000 |
| 106 | 300 |和order_address表:
| order_id | country | region |
|----------|---------|--------|
| 100 | US | CA |
| 101 | US | LA |
| 102 | UK | GL |
| 103 | UK | GL |
| 104 | UK | GB |
| 105 | CA | OT |
| 106 | AU | QL |我想按国家和地区获得订单数据,并按表现最好的国家(地区)排序。
SELECT
oa.country, oa.region, SUM(o.amount) AS 'total_sales'
FROM order o
INNER JOIN order_address oa ON o.order_id = oa.order_id
GROUP BY oa.country, oa.region
ORDER BY SUM(o.amount) DESC, oa.country, oa.region 但这并不像预期的那样起作用,因为它破坏了国家顺序。只有在所有高绩效国家的区域都得到展示的情况下,其他国家的成果才会随之出现。
实际上,以下是所期望的结果:
| country | region | total_sales |
|---------|--------|-------------|
| CA | OT | 2000 |
| US | CA | 1000 |
| US | LA | 250 |
| UK | GL | 620 |
| UK | GB | 25 |
| AU | QL | 300 |发布于 2018-08-06 21:16:19
我假设您希望按(按国家的总数)、然后按国家(在此级别上为平手的情况)、然后(按区域的总数)、然后按区域(如果需要的话,作为区域级别的平局者)进行排序。
下面是调整后的SQL:
SELECT
oa.country, oa.region, SUM(o.amount) AS 'total_sales'
FROM `order` o
INNER JOIN order_address oa ON o.order_id = oa.order_id
INNER JOIN (SELECT oa1.country, SUM(o1.amount) AS ctry_sales
FROM order_address oa1
INNER JOIN `order` o1 ON o1.order_id = oa1.order_id
GROUP BY oa1.country
) c ON oa.country = c.country
GROUP BY oa.country, c.ctry_sales, oa.region
ORDER BY c.ctry_sales DESC, oa.country, SUM(o.amount) DESC, oa.region我们在标记为c的子查询中确定每个国家的总数。然后,我们将它加入到您已经拥有的两个表中,并将每个国家的总数添加为ORDER BY中的第一个排序条件。当然后移动国家之前的总销售额按地区,以确保我们保持在同一个国家的条目在一起,即使两个国家有相同的每个国家的总数。
结果(如您在本SQLFiddle中所看到的)是您所要求的:
CA OT 2000
US CA 1000
US LA 250
UK GL 620
UK GB 25
AU QL 300https://dba.stackexchange.com/questions/214214
复制相似问题