2010-04-08 86 views
4

嘿尖子。我在遇到以下SQL語句時遇到了問題。我知道我無法在OnlineStatus列上執行GROUP BY,它是有道理的,因爲它是一個函數調用,而不是表中的實際列。我如何修改這個以便我可以計算有多少用戶在線?微軟SQL計數問題

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 

回答

8

這是最好的使用子查詢做到:

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,正是我在想 – 2010-04-08 19:04:59

+0

Perrrrrrrrrrrfect! – Matt 2010-04-08 19:13:00

+0

好,墊,給Andomar他的「答案」,那麼...(即使他並不真的需要它,有這麼大點:) – 2010-04-08 19:19:12

2

,如果您使用的是內部的選擇它應該工作:

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,幾秒錯過了... – 2010-04-08 19:15:45

0

你也可以移動CASE WHENCOUNT

僞代碼:
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