2010-04-08 5 views
4

Hey smarties. J'ai des problèmes avec l'instruction SQL suivante. Je sais que je ne peux pas faire un GROUP BY sur la colonne OnlineStatus, et c'est logique parce que c'est un appel de fonction, pas une colonne réelle dans ma table. Comment est-ce que je modifierais ceci pour que je puisse compter le nombre d'utilisateurs en ligne?Problème Microsoft SQL Count

SELECT CASE dbo.fnGetWebUserOnlineStatus(W.Id) 
     WHEN 1 THEN 'Online' 
     WHEN 2 THEN 'Ingame' 
     ELSE 'Offline' 
     END AS OnlineStatus 
FROM dbo.WebUsers W 
WHERE W.[Status]=1 
GROUP BY OnlineStatus 

Répondre

8

qui est le mieux fait en utilisant un sous-requête:

SELECT OnlineStatus, count(*) 
FROM (
    SELECT CASE dbo.fnGetWebUserOnlineStatus(W.Id) 
     WHEN 1 THEN 'Online' 
     WHEN 2 THEN 'Ingame' 
     ELSE 'Offline' 
     END AS OnlineStatus 
    FROM dbo.WebUsers W 
    WHERE W.[Status]=1 
) sub 
GROUP BY OnlineStatus 
+0

+1, exactement ce que je pensais –

+0

Perrrrrrrrrrfect !! – Matt

+0

Eh bien, Mat, donnez à Andomar sa "Réponse" puis ... (même s'il n'en a pas vraiment besoin, avec autant de points :) –

2

Il devrait fonctionner si vous utilisez une sélection intérieure:

SELECT OnlineStatus, COUNT(*) 
FROM (
    SELECT CASE dbo.fnGetWebUserOnlineStatus(W.Id) 
       WHEN 1 THEN 'Online' 
       WHEN 2 THEN 'Ingame' 
       ELSE 'Offline' 
      END AS OnlineStatus 
      FROM dbo.WebUsers W 
      WHERE W.[Status]=1 
) AS T1 
GROUP BY OnlineStatus 
+0

+1, l'a raté de quelques secondes ... –

0

Vous pouvez également déplacer le CASE WHEN dans le COUNT

Pseudo:

SELECT 
    COUNT(CASE dbo.fnGetWebUserOnlineStatus(W.Id) WHEN 1 THEN 1 ELSE NULL END) as OnlineCount, 
    COUNT(CASE dbo.fnGetWebUserOnlineStatus(W.Id) WHEN 2 THEN 1 ELSE NULL END) as IngameCount ... 
FROM dbo.WebUsers W 
WHERE W.[Status]=1