计算子组中的记录数,同时保留组中的记录数

时间:2013-06-25 08:22:29

标签: sql group-by grouping

我有一个包含以下结构的表格(这是一个简化版本,只是为了表明这个想法):

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条款。

2 个答案:

答案 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;