2011-08-15 1 views
0

Je suis bloqué sur une requête SQL.SQL Puzzle - Pourquoi je ne peux pas joindre ces deux sous-requêtes?

Tenir compte le tableau suivant:

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 

Ce tableau contient les résultats des tours de jeu. Maintenant, parfois, vous pouvez grimper une réponse au jeu et se retrouver avec un temps de conjecture de 35 ou même 0 millisecondes. Ces réponses faussent les résultats de mon jeu et je veux les enlever.

Je veux comprendre le temps moyen approximatif où la supposition est au moins 200 millisecondes de long. Donc, si un jeu a eu cinq tours avec des conjectures de 455, 400, 340, 30, 300. Je veux ignorer les 30 et moyenne sur les quatre valeurs restantes et obtenir un temps de conjecture moyenne de 374. Sans laisser tomber les 30 le temps moyen deviner Mon problème est que j'essaye de joindre deux sous-requêtes et j'obtiens un message d'erreur indiquant qu'il y a un problème autour de l'instruction "on". Je pense que joindre des sous-requêtes est autorisé.

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

Avez-vous envisagé de créer des vues pour rendre votre code T-SQL un peu plus facile à lire/écrire/maintenir? Si cette requête est appelée beaucoup, une vue indexée peut même avoir un sens pour la sous-requête que vous avez appelée vt. –

+0

Voter pour fermer car des questions comme celle-ci sont pratiquement garanties pour ne jamais aider quelqu'un d'autre dans le futur. C'est beaucoup trop localisé pour être utilisé à l'avenir. – JNK

Répondre

5

Parce que vous manquez une fin) (2ème à la dernière ligne)

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

Vous n'avez pas fermé tous vos sous-requêtes:

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 

J'ajouté ceci: ) vtIII) f

1

Comptez vos parenthèses.

inner join (

n'est jamais fermé.

Questions connexes