Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL CASE语句,带有直方图的子查询_Mysql_Sql - Fatal编程技术网

MySQL CASE语句,带有直方图的子查询

MySQL CASE语句,带有直方图的子查询,mysql,sql,Mysql,Sql,我正在尝试收集数据以创建直方图。我想创建用户登录系统次数的直方图。我的目标是利用answer中的函数,但如果有更好的方法,我也可以 我的登录表与此类似: datetime | userid 我的第一步是获取用户登录的次数计数: select count(userid) from logins group by userid 这将返回一个很好的结果集,类似于: 1325 761 4012 1204 662 1841 15 1698 ... 我的问题是,我如何调整它以利用链接答案中的SELEC

我正在尝试收集数据以创建直方图。我想创建用户登录系统次数的直方图。我的目标是利用answer中的函数,但如果有更好的方法,我也可以

我的登录表与此类似:

datetime | userid
我的第一步是获取用户登录的次数计数:

select count(userid) from logins group by userid
这将返回一个很好的结果集,类似于:

1325
761
4012
1204
662
1841
15
1698
...
我的问题是,我如何调整它以利用链接答案中的SELECT CASE WHEN方法。该代码如下所示:

SELECT CASE WHEN age BETWEEN 13 AND 17 THEN '13-17' 
            WHEN age BETWEEN 18 AND 25 THEN '18-25' 
            ELSE '26+' END AS AgeGroup,
    COUNT(*) AS total
FROM MyTable
GROUP BY AgeGroup

然而,在我的例子中,WHEN子句中的age是一个子查询,我认为不需要为每个WHEN运行它。利用这些箱子中的计数的有效方法是什么?

您需要通过以下方式将箱子添加到组中:

select case when age between 13
                and 17 then '13-17' when age between 18
                and 25 then '18-25' else '26+' end as AgeGroup,
    COUNT(*) as total
from MyTable
group by case when age between 13
                and 17 then '13-17' when age between 18
                and 25 then '18-25' else '26+' end
如果您想写一次案例,请执行以下操作:

select AgeGroup,
    count(*) as total
from (
    select case when age between 13
                    and 17 then '13-17' when age between 18
                    and 25 then '18-25' else '26+' end as AgeGroup
    from MyTable
    ) t
group by AgeGroup

因此,看起来您希望确定登录次数的范围,在这种情况下,您首先计算每个用户的登录尝试次数,然后将各个次数合并到不同的存储桶中

以下查询将提供登录1-2次、3-4次和4次以上的用户数

工作小提琴:

如果需要根据实际登录计数创建存储桶,请使用SUMtotal_登录而不是COUNTuser_id,如下查询:

SELECT CASE WHEN total_logins BETWEEN 1 AND 2 THEN '1-2' 
            WHEN total_logins BETWEEN 3 AND 4 THEN '3-4' 
            ELSE '4+' 
       END AS LoginGroup,
       SUM(total_logins) AS total
FROM (
  SELECT userid, COUNT(*) AS total_logins 
  FROM login 
  GROUP BY userid
) t
GROUP BY LoginGroup

请看一下这个代码

SELECT 
CASE age 
    WHEN BETWEEN 13 AND 17 THEN '13-17' 
    WHEN BETWEEN 18 AND 25 THEN '18-25' 
    ELSE '26+'
END AS AgeGroup,
COUNT(*) AS total
FROM MyTable
GROUP BY CASE age 
    WHEN BETWEEN 13 AND 17 THEN '13-17' 
    WHEN BETWEEN 18 AND 25 THEN '18-25' 
    ELSE '26+'
END

您希望结果如何?
SELECT 
CASE age 
    WHEN BETWEEN 13 AND 17 THEN '13-17' 
    WHEN BETWEEN 18 AND 25 THEN '18-25' 
    ELSE '26+'
END AS AgeGroup,
COUNT(*) AS total
FROM MyTable
GROUP BY CASE age 
    WHEN BETWEEN 13 AND 17 THEN '13-17' 
    WHEN BETWEEN 18 AND 25 THEN '18-25' 
    ELSE '26+'
END