没有想要这样做(寻求帮助)但是我很难过......
我正在编写曲棍球池计划,其中一项功能是计算所有玩家(守门员和滑冰者)的每周积分总数"玩"对于特定的游泳池团队。
我有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且我只对第一周感兴趣的每个泳池队(滑冰者和守门员)。
这是我提出的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
非常感谢任何帮助....谢谢!
答案 0 :(得分:2)
您可以使用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;
从长远来看,它可以帮助您的数据库设计将这两个表规范化为1,可能还有一个辅助表,用于特殊守门员字段。
MondayPlayerStats ExtraGoalieStats
----------------- ----------------
Id -> MondayPlayerId
Pts Blocks
Status ... whatever
WeekNumber
Position (goalie, etc)
... etc