I have a table with the following structure (it's a simplified version, just to show the idea):
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.
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With