【问题标题】:SQL: Sum values from two different tablesSQL:对来自两个不同表的值求和
【发布时间】: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 让我很困惑……因为这很明显。

标签: sql


【解决方案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
  • 谢谢你。之前提出了一些非常相似的建议,我可能不得不接受它。我原以为加入这些表格会很容易,但它会带来很多问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多