SQL:对来自两个不同表的值求和

Posted

技术标签:

【中文标题】SQL:对来自两个不同表的值求和【英文标题】:SQL: Sum values from two different tables 【发布时间】:2018-03-21 16:22:37 【问题描述】:

不想这样做(寻求帮助)但我很难过......

我正在编写一个曲棍球台球程序,其中一个功能是计算所有球员(守门员和溜冰者)在特定台球队“比赛”的每周总积分。

我有 3 张桌子。

    **PoolTeams** 
PoolTeamID      PoolTeamName
----------      ------------ 
1               Team A 
2               Team B 
3               Team C

**MondaySkaterStats**
Player      Weeknumber       PoolTeam        PTS       Status
------      ----------       --------        ---       ------
10          1                1               15        True
11          2                1               3         False
13          3                2               5         True
40          1                1               3         True
41          2                1               5         False
43          3                2               1         True

**MondayGoalieStats** 
Player           Weeknumber       PoolTeam        PTS       Status
------           ----------       --------        ---       ------ 
20               1                3               4         False 
21               2                1               3         True 
22               3                2               5         False
50               1                3               4         False 
51               2                1               3         True 
52               1                1               7         True

实际的数据库要大得多,为了清楚起见,我截断了很多。

此外,MondayGoalieStats 表还有一些与结果无关的额外列。

假设我想总结为每个台球队(溜冰者和守门员)打球的所有球员的积分,状态为 TRUE 并且我只对第 1 周感兴趣。

这是我想出的一个 SQL 查询。总结 MondaySkaterStats 积分时效果很好,但无论出于何种原因,它似乎都不能正确总结 MondayGalieStats 表中的积分。 我决定使用 INNER JOIN,因为 Player 和 Goalie 表并不完全相同。我用 Weeknumber 作为两者的共同点。

SELECT PT.PoolTeamName, SUM(MS.PTS) AS PlayerSum, SUM(MG.PTS) as GoalieSum
FROM PoolTeams PT, MondaySkaterStats MS 
INNER JOIN MondayGoalieStats MG ON (MS.Weeknumber=MG.Weeknumber) 
WHERE MS.Weeknumber=1 
AND PT.PoolTeamID = MS.PoolTeam 
AND MS.PoolTeam = MG.PoolTeam 
AND MS.Status = True 
AND MG.Status = True
GROUP BY PT.PoolTeamName

任何帮助将不胜感激....谢谢!

【问题讨论】:

你正在使用的标签数据库 你在这里有一个奇怪的语法组合......使用内部连接语法(首选)或在 where 子句中使用较旧的连接,而不是两者。您甚至使用两种方法加入了 mg(where 子句中的 poolteam,on 子句中的周数) 数据库结构似乎有点复杂......难道不可能有一个全局表“MondayStats”,其中有一个额外的列存储“skaters”或“goalie”吗?请求会容易得多。 该查询难以阅读且混乱。我什至不确定这是有效的语法。 狗仔队,是的……同意。我刚刚进入 SQL 的事情,而 JOIN 让我很困惑……因为这很明显。 【参考方案1】:

您可以使用UNION 创建中间表,并为每个表添加标签以保持位置分开。 然后,您可以按团队和职位分组。这将导致每个团队 2 行,每个位置 1 行。 最后,JOINPoolTeam 表得到PoolTeamName 进行显示。

(不同的引擎会有不同的语法;我习惯了mysql

SELECT PoolTeams.PoolTeamName, SUM(Pts), position FROM
(
    SELECT PoolTeam, Pts, "Skater" as position 
        FROM MondaySkaterStats WHERE Status = "True" AND WeekNumber = 1
    UNION ALL
    SELECT PoolTeam, Pts, "Goalie" as position 
        FROM MondayGoalieStats WHERE Status = "True" AND WeekNumber = 1
) table_alias

LEFT JOIN PoolTeams ON table_alias.PoolTeam = PoolTeams.PoolTeamID

GROUP BY PoolTeam, position;

从长远来看,这将有助于您的数据库设计将这 2 个表规范化为 1 个表,可能还有一个用于特殊守门员字段的辅助表。

MondayPlayerStats     ExtraGoalieStats
-----------------     ----------------
Id                ->  MondayPlayerId
Pts                   Blocks
Status                ... whatever
WeekNumber
Position (goalie, etc)
... etc

【讨论】:

PoolTeamName 不可用。您需要加入。 编辑了我的答案以在PoolTeams 表中包含JOIN 谢谢你。之前提出了一些非常相似的建议,我可能不得不接受它。我原以为加入这些表格会很容易,但它会带来很多问题。感谢您的帮助。

以上是关于SQL:对来自两个不同表的值求和的主要内容,如果未能解决你的问题,请参考以下文章

如果我想对来自 2 个表的乘以 2 个值的项目求和,如何在 oracle 中创建过程

添加两个变量,其中包含来自同一数据库的两个不同表的值

对两个不同查询 (SQL) 的结果求和

比较来自两个不同表的两列的逗号分隔值

从同一个表的两个不同列中选择不同的值

使用 ASP.Net 在 SQL 中对表的列值求和时出现异常