【发布时间】:2017-10-25 21:55:48
【问题描述】:
表结构如下:
Players (PlayerID, FirstName, LastName, PositionID)
Salaries (SalaryID, PlayerID, Amount)
ScoredGoals (GoalId, PlayerID, GameID, Minute)
Positions (PositionID, PositionName)
我需要找到每个职位每个目标支付的薪水。这个查询产生了正确的结果,但我想知道是否有更有效的方法来做到这一点。任何帮助表示赞赏!
SELECT g.PositionName,
(s.AvgSalPerPosition / g.GoalsPerPosition) as SalPerGoalPerPosition
FROM
(#TOTAL GOALS PER POSITION
SELECT po.PositionName,
po.PositionID,
COUNT(GoalID) as GoalsPerPosition
FROM ScoredGoals sg
JOIN Players p ON sg.PlayerID = p.PlayerID
JOIN Positions po ON p.PositionID = po.PositionID
GROUP BY po.PositionID) g
JOIN
(#AVG SALARY PER POSITION
SELECT po.PositionID,
AVG(Amount) as AvgSalPerPosition
FROM Positions po
JOIN Players p ON po.PositionID = p.PositionID
JOIN Salaries s ON p.PlayerID = s.PlayerID
GROUP BY po.PositionID) s ON g.PositionID = s.PositionID
【问题讨论】:
-
看起来我会怎么写。
-
可能不会有什么不同,但
COUNT(GoalID)可以是COUNT(*)。见stackoverflow.com/questions/2876909/… -
我觉得很好。
-
@Barmar - 这应该是相同的运行计划。究竟我将如何处理它b.digg,看起来不错......我想我们可以指出得分目标中的1行= 1个目标是一个假设,但如果这个假设是有效的,那么你很好。竖起大拇指的表情符号在哪里?
-
您的查询真的有性能问题吗?假设您在要加入的所有列上都有索引,我认为它应该表现良好。