2011-08-15 2 views
0

SQL 쿼리가 작동하지 않습니다.SQL Puzzle -이 두 개의 하위 쿼리를 결합 할 수없는 이유는 무엇입니까?

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의 추측을 가진 5 라운드가 있다면 30을 무시하고 나머지 4 개의 값을 평균하여 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 
+1

T-SQL 코드를 읽기/쓰기/유지하기가 더 쉽도록보기를 만드는 것을 고려 했습니까? 이 쿼리가 많이 호출되면 인덱싱 된 뷰는 vt라고 부른 하위 쿼리에도 의미가있을 수 있습니다. –

+0

이런 질문이 나오면 가까운 장래에 다른 사람을 도울 수 없다는 보장이 거의 확실합니다. 이것은 앞으로의 사용을 위해 너무 지역화되어 있습니다. – JNK

답변

5

당신은) 마지막 라인 (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

당신은 폐쇄되지 않은 모든 하위 쿼리 : ) vtIII) f

:

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 

나는이 추가

1

괄호를 계산하십시오.

inner join (

는 절대로 닫히지 않습니다.

관련 문제