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> Je veux que mes résultats ressemblent à ceci quand j'exécute une requête pour un vélo spécifique P> en ce moment, mes résultats ressemblent à ceci: p> 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
3 Réponses :
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.
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 code> 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 code> et le somme () code> serait null code>, pas 0 code>.
@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 code> serait calculé en tant que Somme (null, null, null) code> -> null code>.
@YPERCUBE: Ah, je vois maintenant ce que vous vouliez dire, désolé d'être stupide.
En supposant que si vote code> est bit code>: vote code> n'est pas bit Code>, vous pouvez vous débarrasser de 0 + code> dans le gagne code> calcul. p> p>
Le vote est un INT, en utilisant uniquement 0 et 1 comme options. Votre SQL a l'air vraiment lisible et propre.
En supposant que vote code> est int code> et prend uniquement 0 code> ou 1 code> valeurs, vous pouvez également utiliser ceci: < Pré> xxx pré> p>