I have a table with the following structure (it’s a simplified version, just to show the idea):
x
name | city
------------------
John | New York
Thomas | Berlin
Hans | Berlin
Boris | Moscow
Boris | Moscow
Vasiliy | Moscow
I can use group by
to get a total number of people in every city, like so:
select count(*) from my_table group by city
But I need a little bit more and I can’ wrap my head around it: I need to get a number of all people with the same name in the same city while keeping a total number of people in that city. This is how the result should look like:
name | totalWithThisName | totalInThisCity | city
--------------------------------------------------------
John | 1 | 1 | New York
Thomas | 1 | 2 | Berlin
Hans | 1 | 2 | Berlin
Boris | 2 | 3 | Moscow
Vasiliy | 1 | 3 | Moscow
I know that I can take a raw data from db, and make calculations in my java program, but it would be great to make it in a plain SQL.
Update: I’m using mysql
and I can’t use over
clause.
Advertisement
Answer
The solution I’ve made so far is to use subquery with join
. It looks like this:
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;