Головоломка SQL - Почему я не могу присоединиться к этим двум подзапросам? - PullRequest
0 голосов
/ 15 августа 2011

Я застрял в запросе 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 миллисекунд.Так что, если в игре было пять раундов с угаданиями 455, 400, 340, 30, 300. Я хочу игнорировать 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

Ответы [ 3 ]

5 голосов
/ 15 августа 2011

Поскольку у вас нет конца) (от 2-й до последней строки)

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 ) vtIII
 on vtIII.gameid = vt.gameid
4 голосов
/ 15 августа 2011

Вы не закрыли все свои подзапросы:

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

1 голос
/ 15 августа 2011

Подсчитайте ваши скобки.

inner join  (

никогда не закрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...