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 行。
最后,JOIN
PoolTeam
表得到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:对来自两个不同表的值求和的主要内容,如果未能解决你的问题,请参考以下文章