2011-02-25 2 views
3

Supposons que j'ai une table GAME avec les champs suivantsComment calculer les ratios en SQL?

user_id, result 

Je souhaite calculer le pourcentage de gain défini comme le nombre total d'enregistrements où

result = 'Win' 

par rapport au nombre total d'enregistrements où

result <> '' 

Comment est-ce que je peux faire ceci dans le SQL et renvoyer le résultat dans l'ordre avec le pourcentage de victoire le plus élevé en premier?

Répondre

12

La plupart des systèmes de bases de données devraient être en mesure de gérer cela avec quelque chose comme:

Select user_id 
    , Sum(Case When Result = 'Win' Then 1 Else 0 End)/Count(*) * 1.0 As WinPercent 
From Game 
Group By user_id 
Order By WinPercent Desc 

BTW, je suppose que vous vouliez dire le pourcentage de victoire est le nombre total de victoires sur le nombre total de Jeux. Si vous avez vraiment dire where result <> '', alors vous devrez modifier la requête comme ceci:

Select user_id 
    , Sum(Case When Result = 'Win' Then 1 Else 0 End) 
     /Sum(Case When Result <> '' Then 1 Else 0 End) * 1.0 As WinPercent 
From Game 
Group By user_id 
Order By WinPercent Desc 

Addition

Il a été suggéré dans les commentaires que c'est spécifique SQL Server. Ce n'est pas. Tout dans les solutions ci-dessus fait partie de la norme SQL. Si un système de base de données donné implémente toutes les fonctionnalités requises est évidemment une autre question. Donc, si nous passons à la recherche d'une solution qui fonctionnerait réellement sur la plupart des systèmes de bases de données, la seule fonctionnalité qui aurait le plus de variabilité serait probablement l'utilisation de l'alias de colonne dans l'ordre par. Vous pouvez obtenir l'équivalent en deux façons, mais d'une façon qui fonctionnerait sur la plupart des systèmes de base de données serait d'utiliser une table dérivée:

Select Z.user_id, Z.WinPercent 
From (
     Select user_id 
      , Sum(Case When Result = 'Win' Then 1 Else 0 End) 
       /Sum(Case When Result <> '' Then 1 Else 0 End) * 1.0 As WinPercent 
     From Game 
     Group By user_id 
     ) As Z 
Order By Z.WinPercent Desc 
+0

semble bien, mais est spécifique au serveur sql. –

+0

@Stefan Steinegger - Comment pensez-vous que SQL Server est spécifique? – Thomas

+0

Je pensais que 'Case When' n'est pas standard SQL. Mais vous avez raison, c'est ansi sql. Je le savais seulement du serveur sql, oracle utilisé pour avoir cette fonction de décodage. –

1

MySQL, vous pouvez utiliser ce raccourci:

SELECT user_id, avg(Result = 'Win') AS WinPercent 
FROM Game 
GROUP BY user_id 
ORDER BY WinPercent DESC 

En supposant que le résultat ne soit jamais NULL (chaîne vide est ok). Sinon, vous devez utiliser Résultat EST NON NULL ET Resultat = 'Win'

Questions connexes