8
votes

Comment gagne-t-il des victoires et des pertes en utilisant la somme et le cas?

J'utilise SQL Server 2008

J'essaie de taire les victoires et les pertes pour tout vélo donné. Chaque fois qu'un utilisateur vote, il vote pour un vélo (1) et un vote contre un autre vélo (0). P>

ma table de vote ressemble à ceci: p> xxx pré>

Je veux que mes résultats ressemblent à ceci quand j'exécute une requête pour un vélo spécifique P> xxx pré>

en ce moment, mes résultats ressemblent à ceci: p> xxx pré>

Ma requête ressemble à ceci: p>

SELECT  SUM(CASE WHEN Vote = 1 THEN 1 END) AS Wins,
    SUM(CASE WHEN Vote = 0 THEN 1 END) AS Losses
FROM     Votes
WHERE    BikeID = 101
GROUP BY Vote


0 commentaires

3 Réponses :


6
votes
SELECT  SUM(CASE WHEN Vote = 1 THEN 1 ELSE 0 END) AS Wins,
    SUM(CASE WHEN Vote = 0 THEN 1 ELSE 0 END) AS Losses
FROM     Votes
WHERE    BikeID = 101
The problem is your case statements did not cover all conditions, and so were returning null for the cases where they did not account for.Also, you did not need the group by vote, since you aren't actually selecting the vote outside the aggregates.

6 commentaires

Wow, je viens de me débarrasser du "groupe par" et j'ai eu ma réponse. Merci! Il n'y a que 1 et 0 pour les réponses possibles. Je ne pense pas que l'autre est nécessaire, n'est-ce pas?


Je garderais cela là-bas pour la complétude. Clairement, ce n'est pas nécessaire, comme vous l'avez travaillé sans cela. Je pense que cela se lit plus clairement avec là-bas.


Le else 0 est nécessaire au cas où il n'y a pas de rangées négatives (ou positives). Le laissant sortir implique implique sinon null et le somme () serait null , pas 0 .


@YPERCUBE: En fait non, une seule null n'affecterait pas tout le résultat. SUM () ne renverrait que NULL s'il n'y avait aucune valeur à additionner, ce qui peut être soit quand il n'y a pas de lignes du tout ou lorsque toutes les valeurs sont nuls. Cela est vrai pour SQL Server 2005 et ultérieurement, et il est donc vrai pour le cas de l'OP. Mais vous pouvez avoir raison en ce qui concerne les versions précédentes, je ne peux tout simplement pas raconter à coup sûr.


@Andriy: C'est ce que je voulais dire aussi. S'il n'y a que des votes positifs, alors pertes serait calculé en tant que Somme (null, null, null) -> null .


@YPERCUBE: Ah, je vois maintenant ce que vous vouliez dire, désolé d'être stupide.



3
votes

En supposant que vote est bit : xxx

si vote n'est pas bit , vous pouvez vous débarrasser de 0 + dans le gagne calcul.


1 commentaires

Le vote est un INT, en utilisant uniquement 0 et 1 comme options. Votre SQL a l'air vraiment lisible et propre.



3
votes

En supposant que vote est int et prend uniquement 0 ou 1 valeurs, vous pouvez également utiliser ceci: < Pré> xxx


0 commentaires