SQL难题-为什么可以';我不能加入这两个子查询吗?

SQL难题-为什么可以';我不能加入这两个子查询吗?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我被SQL查询卡住了 考虑下表: Table DG_GAME_ROUNDS RoundId int GameId int RoundNumber int Value varchar(20) Guess varchar(20) Answer varchar(20) Correct bit Minutes int Seconds int Milliseconds int 此表包含游戏回合的结果。现在,有时你可以在游戏中找到答案,并以35毫秒甚至0毫秒的猜测时间结束。这些答

我被SQL查询卡住了

考虑下表:

Table DG_GAME_ROUNDS    
RoundId int
GameId  int
RoundNumber int
Value   varchar(20)
Guess   varchar(20)
Answer  varchar(20)
Correct bit
Minutes int
Seconds int
Milliseconds    int
此表包含游戏回合的结果。现在,有时你可以在游戏中找到答案,并以35毫秒甚至0毫秒的猜测时间结束。这些答案扭曲了我的比赛结果,我想把它们去掉

我想计算出平均猜测时间,其中猜测至少有200毫秒长。因此,如果一场游戏有五轮,猜度为4554034030300。我想忽略30,平均剩下的四个值,得到平均猜测时间374。如果不降低30,平均猜测时间将为305

我的问题是,我试图连接两个子查询,但收到一条错误消息,即“on”语句存在问题。我认为可以加入子查询

 select vt.gameid, vt.totalms, vt.numofguesses, vt.correctguesses
from
(select    gr.gameid 
       ,  sum((gr.seconds*1000) + gr.milliseconds) as totalms
       ,  count(gr.roundid) as numofguesses
       ,  sum(cast(gr.correct as int)) as correctguesses
          from work_tables.dbo.dg_game_rounds gr (nolock)            
          group by gr.gameid 
  ) vt 
inner join  (
              select vtIII.gameid, vtIII.avgtime
              from 
                  (
                     select vtII.gameid, sum(vtII.avgms)/count(vtII.avgms) as avgtime
                     from (
                              select gr.gameid, gr.seconds * 1000 + gr.milliseconds as avgms
                              from dg_game_rounds gr (nolock)
                              where gr.seconds * 1000 + gr.milliseconds > 200
                          ) vtII
                     group by vtII.gameid
                   ) vtIII 
 on vtIII.gameid = vt.gameid

因为你错过了一个结尾)(从第二行到最后一行)


您尚未关闭所有子查询:

select vt.gameid, vt.totalms, vt.numofguesses, vt.correctguesses
from
(select    gr.gameid 
       ,  sum((gr.seconds*1000) + gr.milliseconds) as totalms
       ,  count(gr.roundid) as numofguesses
       ,  sum(cast(gr.correct as int)) as correctguesses
          from work_tables.dbo.dg_game_rounds gr (nolock)            
          group by gr.gameid 
  ) vt 
inner join  (
              select vtIII.gameid, vtIII.avgtime
              from 
                  (
                     select vtII.gameid, sum(vtII.avgms)/count(vtII.avgms) as avgtime
                     from (
                              select gr.gameid, gr.seconds * 1000 + gr.milliseconds as avgms
                              from dg_game_rounds gr (nolock)
                              where gr.seconds * 1000 + gr.milliseconds > 200
                          ) vtII
                     group by vtII.gameid
                   ) vtIII ) f
 on f.gameid = vt.gameid

我加了这个:
)vtIII)f

数一数你的括号

inner join  (

从不关闭。

您是否考虑过创建视图以使T-SQL代码更易于阅读/编写/维护?如果这个查询被多次调用,索引视图甚至可能对您调用vt的子查询有意义。投票结束,因为这样的问题几乎可以保证将来不会帮助任何其他人。这太本地化了,无法在将来使用。
inner join  (