If two rows have the same Sum(Sales), the Rank divides the ranking on the two rows. There is a parameter within the Rank() function which you can use to get different values of rank when you run into those situations. I will look here to understand Rank() function here
And as if i create a new expression like below: aggr(Sum(Sales), Category, [Product Group]), the calculated total only present in a few rows. What's the logic?
Found the keyword Nodistinct should be used in this case, just record here for other reference.
If you more than 2 dimension in your chart and you are using the above expression, you can run into an issue which is called grain mismatch. You already found a work around (NODISTINCT), but read more on this here