Get Field Hierachy

问题描述 投票:0回答:2

我有下表,我想按国家/地区获取用户数量:

+--------+------+:
| user   | zone |
+--------+------+
| Paul   | 7    |
+--------+------+
| John   | 5    |
+--------+------+
| Peter  | 6    |
+--------+------+
| Frank  | 5    |
+--------+------+
| Silvia | 2    |
+--------+------+
| Carl   | 4    |
+--------+------+
| Mark   | 3    |
+--------+------+

地区

+---------+-----------------+----------+--+
| zone_id | zone_name       | idUpzone |  |
+---------+-----------------+----------+--+
| 1       | Global          | null     |  |
+---------+-----------------+----------+--+
| 2       | US              | 1        |  |
+---------+-----------------+----------+--+
| 3       | Florida         | 2        |  |
+---------+-----------------+----------+--+
| 4       | Orlando         | 3        |  |
+---------+-----------------+----------+--+
| 5       | China           | 1        |  |
+---------+-----------------+----------+--+
| 6       | Orlando Sector  | 4        |  |
+---------+-----------------+----------+--+
| 7       | Beijing         | 5        |  |
+---------+-----------------+----------+--+

所以我得到这样的东西

+---------+-----+
| Country | QTY |
+---------+-----+
| US      | 4   |
+---------+-----+
| China   | 3   |
+---------+-----+
sql sql-server ssms sql-scripts
2个回答
1
投票

使用递归CTE来获得最高级别,然后单击join

with cte as (
      select zone_id, zone_id as top_zone_id, zone_name as top_zone_name, 1 as lev
      from regions
      where parent_zone_id = 1
      union all
      select r.zone_id, cte.top_zone_id, top_zone_name, lev + 1
      from cte join
           regions r
           on r.idUpzone = cte.zone_id
    )
select cte.top_zone_name, count(*)
from users u join
     cte 
     on u.zone = cte.zone_id
group by cte.top_zone_name;

0
投票

尝试一下:

SELECT 
    r.zone_name AS Contry, COUNT(*) QTY 
FROM (
    SELECT * FROM users u
    INNER JOIN regions r ON u.zone = r.zone_id
) a
GROUP BY r.zone_name
© www.soinside.com 2019 - 2024. All rights reserved.