如何在SQL语句中使用GROUP BY和JOIN?

问题描述

我有两个叫“ 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)上的索引-尽管与少量数据无关。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...