【问题标题】:Microsoft SQL Count problemMicrosoft SQL 计数问题
【发布时间】:2010-04-08 19:01:15
【问题描述】:

嘿聪明人。我在使用以下 SQL 语句时遇到问题。我知道我不能对 OnlineStatus 列执行 GROUP BY,这是有道理的,因为它是一个函数调用,而不是我表中的实际列。我将如何修改它以便统计有多少用户在线?

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

【问题讨论】:

    标签: sql sql-server count


    【解决方案1】:

    最好使用子查询:

    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
    

    【讨论】:

    • 好吧,马特,然后给安多马尔他的“答案”......(即使他并不真正需要它,有那么多点:)
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      您也可以将CASE WHEN 移动到COUNT

      伪代码:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        相关资源
        最近更新 更多