使用Lahman数据库和MS-Access 2013进行统计工作。我创建了几个视图来计算击球事件的线性权重,作为计算高级统计数据(如wOBA,wRC等)的中间步骤。这些视图占据了整个宇宙棒球统计数据并按年份分组。这些视图中的最后一个(RunValues2)具有一个计算字段,该字段返回没有问题的值。该字段为runMinus
,如下面的缩写查询所示(请忽略不必要的连接,除非它是这个工作的原因):
SELECT RunValues.yearID
, RunValues.RperOut
, RunValues.runBB
, RunValues.runHB
, RunValues.run1B
, RunValues.run2B
, RunValues.run3B
, RunValues.runHR
, RunValues.runSB
, RunValues.runCS
, Sum([runBB]*([BB]-nz([ibb]))+[runHB]*nz([HBP])+[run1B]*([H]-[2b]-[3b]-[HR])+[run2B]
*[2b]+[run3B]*[3b]+1.4*[HR]+[runSB]*nz([SB])-[runCS]*nz([CS]))/Sum([ab]-[h]+nz([SF]))
AS runMinus
FROM RunValues INNER JOIN (Batting INNER JOIN v_PrimaryPos ON Batting.playerID = v_PrimaryPos.playerID) ON RunValues.yearID = Batting.yearID
GROUP BY RunValues.yearID, RunValues.RperOut, RunValues.runBB, RunValues.runHB, RunValues.run1B, RunValues.run2B, RunValues.run3B, RunValues.runHR, RunValues.runSB, RunValues.runCS
ORDER BY RunValues.yearID DESC;
我正在使用按联盟分组的总数重新创建这些视图。否则,视图是相同的,只是引用具有相同字段名称的不同视图。
SELECT rvl.yearID
, rvl.lgID
, rvl.RperOut
, rvl.runBB
, rvl.runHB
, rvl.run1B
, rvl.run2B
, rvl.run3B
, rvl.runHR
, rvl.runSB
, rvl.runCS
, Sum([runBB]*([BB]-nz([ibb]))+[runHB]*nz([HBP])+[run1B]*([H]-[2b]-[3b]-[HR])+[run2B]
*[2b]+[run3B]*[3b]+1.4*[HR]+[runSB]*nz([SB])-[runCS]*nz([CS]))
/IIF(Sum([ab]-[h]+nz([SF]))=0,1,Sum([ab]-[h]+nz([SF]))) AS runMinus
FROM RunValuesLeague rvl INNER JOIN BattingLg ON rvl.yearID = BattingLg.yearID AND rvl.lgID=BattingLg.lgID
GROUP BY rvl.yearID, rvl.lgID, rvl.RperOut, rvl.runBB, rvl.runHB, rvl.run1B, rvl.run2B, rvl.run3B, rvl.runHR, rvl.runSB, rvl.runCS
ORDER BY rvl.yearID DESC;
创建新视图时,我收到一个没有编号的重载错误。阅读this回答后,您会看到我添加了IIF
函数,以确保我没有被零除。这没有解决问题。
对这个问题的篇幅深表抱歉,但我很难过并想尽可能多地提供信息。谢谢!
答案 0 :(得分:0)
溢出通常意味着整数溢出。
因此,如前所述,首先从Nz强制数值,然后将所有值转换为货币(如果小数点后四位或更小)或加倍:
Sum(CCur([runBB])*(CCur([BB])-CCur(Nz([ibb],0)))+ ...
答案 1 :(得分:0)
第二个想法,我相信你可以把它减少到:
SELECT rvl.yearID
, rvl.lgID
, rvl.RperOut
, rvl.runBB
, rvl.runHB
, rvl.run1B
, rvl.run2B
, rvl.run3B
, rvl.runHR
, rvl.runSB
, rvl.runCS
, ([runBB]*([BB]-Nz([ibb],0))+[runHB]*Nz([HBP],0)+[run1B]*([H]-[2b]-[3b]-[HR])+[run2B]
*[2b]+[run3B]*[3b]+1.4*[HR]+[runSB]*Nz([SB],0)-[runCS]*Nz([CS],0))
/IIF(([ab]-[h]+Nz([SF],0))=0,1,([ab]-[h]+Nz([SF],0))) AS runMinus
FROM RunValuesLeague rvl
INNER JOIN BattingLg
ON rvl.yearID=BattingLg.yearID AND rvl.lgID=BattingLg.lgID
ORDER BY rvl.yearID DESC;