要获得计数和平均值的单个小计,只需将原始查询包装为内部选择...类似于...(pq = "PreQuery" 选择结果)
Select
max( "Tot Players" ) Players,
max( "->" ) position,
count(*) Year,
avg( pq.age ) AvgAge,
avg( pq.gp ) AvgGP,
avg( pq.goals ) AvgGoals,
avg( pq.assists ) AvgAssists,
avg( pq.sim ) AvgSim
from
( SELECT
px.player,
px.pos,
px.year,
px.age,
px.gp,
px.goals,
px.assists,
1000 - ABS(p1.gp - px.gp)
- ABS(p1.goals - px.goals)
- ABS(p1.assists - px.assists) sim
FROM
hockey p1
JOIN hockey px ON px.player <> p1.player
WHERE
p1.player = 'John Smith'
AND p1.year = 2010
HAVING
sim >= 900
ORDER BY
sim DESC ) pq
如果您的原始查询有效,这应该会为您提供总体平均值。但是,使用具有和顺序的 INNER 查询可能会导致问题。您可能需要取消订单,因为它在最外面的查询中确实没有区别。至于 INNER 查询中的 HAVING 子句,可能需要移到 OUTER SQL-Select 中的 WHERE pq.sim >= 900。
此外,如果您首先想要所有玩家的结果,然后是总数,请获取您的原始查询并将其与这个查询合并...如您所见,为了使列与两个查询保持同步,我'我为玩家和位置添加了一个虚假信息,因此它不会在不匹配的联合中崩溃...请注意,我的 COUNT 列实际上与 ORIGINAL 查询的 YEAR 列相对应。
对于前一年...正如 Rob 所说,您只需对两个查询进行 UNION 即可显示您在每个 UNION 中符合资格的相应年份...
编辑---第二年的澄清......
根据您随后的评论澄清,您必须将基础作为年份 +1 的基础...如果您随后再次想要整体平均值,则这些平均值将被包装到外部最大值/平均值等。 . 但我认为这就是你接下来一年每位球员想要的结果
SELECT
PrimaryQry.PrimaryPlayer,
PrimaryQry.PrimaryPos,
PrimaryQry.PrimaryYear,
PrimaryQry.PrimaryAge,
PrimaryQry.PrimaryGP,
PrimaryQry.PrimaryGoals,
PrimaryQry.PrimaryAssists,
PrimaryQry.player,
PrimaryQry.pos,
PrimaryQry.year,
PrimaryQry.age,
PrimaryQry.gp,
PrimaryQry.goals,
PrimaryQry.assists,
PrimaryQry.sim,
p2.pos PrimaryPos2,
p2.year PrimaryYear2,
p2.age PrimaryAge2,
p2.gp PrimaryGP2,
p2.goals PrimaryGoals2,
p2.assists PrimaryAssists2,
px2.player player2,
px2.pos pos2,
px2.year year2,
px2.age age2,
px2.gp gp2,
px2.goals goals2,
px2.assists assists2,
1000 - ABS(p2.gp - px2.gp)
- ABS(p2.goals - px2.goals)
- ABS(p2.assists - px2.assists) sim2
FROM
( SELECT
p1.player PrimaryPlayer,
p1.pos PrimaryPos,
p1.year PrimaryYear,
p1.age PrimaryAge,
p1.gp PrimaryGP,
p1.goals PrimaryGoals,
p1.assists PrimaryAssists,
px.player,
px.pos,
px.year,
px.age,
px.gp,
px.goals,
px.assists,
1000 - ABS(p1.gp - px.gp)
- ABS(p1.goals - px.goals)
- ABS(p1.assists - px.assists) sim
FROM
hockey p1
JOIN hockey px
ON p1.player <> px.player
WHERE
p1.player = 'John Smith'
AND p1.year = 2010
HAVING
sim >= 900 ) PrimaryQry
JOIN hockey p2
ON PrimaryQry.PrimaryPlayer = p2.player
AND PrimaryQry.PrimaryYear +1 = p2.year
JOIN hockey px2
ON PrimaryQry.Player = px2.Player
AND PrimaryQry.Year +1 = px2.year
如果您按照这里的逻辑,您已经知道内部查询返回了大约 10 个其他玩家。因此,我也在该查询中保留了第一人称基础的统计信息。然后,我将结果集加入曲棍球桌 TWICE ... 加入是主要玩家加入第一个他/她的年份 +1,第二个加入专门针对有资格对抗主要球员的人。最后一列结果得到整个第一年的限定词和第二个限定词,比如
So, it will all be on one row consecutively of
John Smith 2010 Compare Person 1 YearA John Smith 2011 Compare Person 1 YearA+1
John Smith 2010 Compare Person 2 YearB John Smith 2011 Compare Person 2 YearB+1
John Smith 2010 Compare Person 3 YearC John Smith 2011 Compare Person 3 YearC+1