This question is essentially a duplicate of Concatenate many rows into a single text string?.
Here is one method that works in Sql Server 2008:
WITH Ranked ( countryID, rnk, stateName )
AS ( SELECT countryID,
ROW_NUMBER() OVER( PARTITION BY countryID ORDER BY countryID ),
CAST( stateName AS VARCHAR(8000) )
FROM state_master),
AnchorRanked ( countryID, rnk, stateName )
AS ( SELECT countryID, rnk, stateName
FROM Ranked
WHERE rnk = 1 ),
RecurRanked ( countryID, rnk, stateName )
AS ( SELECT countryID, rnk, stateName
FROM AnchorRanked
UNION ALL
SELECT Ranked.countryID, Ranked.rnk,
RecurRanked.stateName + ', ' + Ranked.stateName
FROM Ranked
INNER JOIN RecurRanked
ON Ranked.countryID = RecurRanked.countryID
AND Ranked.rnk = RecurRanked.rnk + 1 )
SELECT countryName, MAX( stateName )
FROM RecurRanked
INNER JOIN country_master on RecurRanked.countryID = country_master.countryID
GROUP BY countryName;
You can see several methods for pulling off this kind of technique here: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
You'll need to be careful if your concatenated list of cities is going to be longer than 8000 characters, though you might be able to get away with doing something like varchar(max) if that's a concern (aside from the fact that it probably wouldn't be a very good way to look at the data).