问题描述
我有两个叫“ Player”和“ Country”的表:
玩家
Person Goals Country
------- ----- -------
Pogba 1 France
Pavard 1 France
Griezmann 2 France
Neymar 3 Brazil
Silva 2 Brazil
国家
Name Continent
------- --------------
France Europe
Brazil South America
我想显示每个国家/地区的目标总数,并显示国家/地区名称,大洲和总目标 所以,我希望我的输出看起来像这样:
Country Continent Goals
------- ------------- ------
France Europe 4
Brazil South America 5
我可以同时显示“国家和大陆”以及“国家和目标”,但我不能同时显示全部三个。 这是我尝试过的:
SELECT Country.Name,Country.Continent,SUM(Player.Goals)
FROM Player
INNER JOIN Country ON Player.Country = Country.Name
GROUP BY Player.Country;
也许我已经简化了吗?我只是不知道如何获得理想的结果。
解决方法
尝试以下操作-将Country.Continent
添加到group by
SELECT Country.Name,Country.Continent,SUM(Player.Goals)
FROM Player
INNER JOIN Country ON Player.Country = Country.Name
GROUP BY Country.Name,Country.Continent
,
SELECT Country.Continent,Player.Country,SUM(Player.Goals)
FROM Player
INNER JOIN Country ON Player.Country = Country.Name
GROUP BY Country.Continent,Player.Country
,
尝试一下
SELECT Country.Name,SUM(Player.Goals) as Goals
FROM Player
INNER JOIN Country ON Player.Country = Country.Name
GROUP BY Country.Name,Country.Continent;
,
尽管将continent
添加到GROUP BY
绝对是一种解决方案,但还有其他解决方案。
首先,您可以在continent
上使用聚合函数:
SELECT c.Name,MAX(c.Continent) as Continent,SUM(p.Goals)
FROM Player p JOIN
Country c
ON p.Country = c.Name
GROUP BY c.Name;
或者,您可以使用相关子查询:
SELECT c.*,(SELECT SUM(p.Goals)
FROM Player p
WHERE p.Country = c.Name
) as goals
FROM Country c;
请注意,这两个都包含表别名,这使查询更易于编写和读取。
最后一个版本的优点是,它避免了外部查询中的聚合,并且使您可以轻松地从Country
中选择任意多的列。如果可用,它也可以利用Player(Country)
上的索引-尽管与少量数据无关。