我有一个包含以下结构的表格(这是一个简化版本,只是为了表明这个想法):
name | city
------------------
John | New York
German | Berlin
Gans | Berlin
Boris | Moscow
Boris | Moscow
Vasiliy | Moscow
我可以使用group by
来获取每个城市的总人数,例如:
select count(*) from my_table group by city
但是我需要更多一点,我可以“绕过它:我需要在同一个城市中找到同名的所有人,同时保留该城市的总人数。这就是结果的样子:
name | totalWithThisName | totalInThisCity | city
--------------------------------------------------------
John | 1 | 1 | New York
German | 1 | 2 | Berlin
Gans | 1 | 2 | Berlin
Boris | 2 | 3 | Moscow
Vasiliy | 1 | 3 | Moscow
我知道我可以从db获取原始数据,并在我的java程序中进行计算,但是在纯SQL中创建它会很棒。
更新:我正在使用mysql
而我无法使用over
条款。
答案 0 :(得分:5)
select distinct name
, count(*) over (partition by Name) as TotalWithThisName
, count(*) over (partition by City) as TotalInThisCity
, city
from YourTable
答案 1 :(得分:3)
我到目前为止所做的解决方案是使用带有join
的子查询。它看起来像这样:
select
name,
city,
count(*) as totalWithThisName,
T.totalInThisCity
from
my_table
join (select
count(*) as totalInThisCity,
city
from
my_table
group by city) T on my_table.city = T.city
group by
city, name;