mysql - 计算某个值是否存在于一系列键中

标签 mysql

当在response_key 95到98之间找到对应于每个uhid并按月分组的response_val=4时,返回计数

|response_key  | response_val | month  | uhid |
|---------------------------------------------|
|  95          |  4           | 2019-09| 14569|
|  96          |  4           | 2019-09| 14569|
|  97          |  5           | 2019-09| 14569|
|  98          |  5           | 2019-09| 14569|
|  95          |  5           | 2019-09| 13256|
|  96          |  5           | 2019-09| 13256|
|  97          |  5           | 2019-09| 13256|
|  98          |  5           | 2019-09| 13256|
|  95          |  5           | 2019-09| 25689|
|  96          |  5           | 2019-09| 25689|
|  97          |  5           | 2019-09| 25689|
|  98          |  5           | 2019-09| 25689|
|---------------------------------------------|

我尝试了 sql 查询

SELECT month,
       COUNT(CASE
          WHEN `response_key` IN (95,96,97,98) and `response_val`='5'
          THEN 1 ELSE NULL END) AS 'yes',
       COUNT(CASE
          WHEN `response_key` IN (81,82,83,84,85,86,87) and `response_val`='4'
          THEN 1 ELSE NULL END) AS 'no' 
FROM audit WHERE group by month

但是当所有response_key的值为4时它返回计数。

我期望结果为

| count | month |
-----------------
|   1   |2019-09|

最佳答案

也许以下内容可以满足您的需求:

SELECT `month`, 
       COUNT(CASE response_val WHEN 4 THEN 1 END) AS `yes`,
       COUNT(CASE response_val WHEN 5 THEN 1 END) AS `no`
FROM audit
WHERE response_key between 95 AND 98
GROUP BY `month`

我简化了您的 case 语句,并将 response_key 条件移至 where 子句中(仅当您想返回 ELSE 以外的值时,才需要 CASE 语句中的 null 部分)。

您可以在这里找到一个有效的演示:https://rextester.com/PCN24609

此查询的结果计数为:

month      yes     no
2019-09    1       11

好吧,您可以根据需要交换输出列的顺序,如果您只对 response_val=4 计数感兴趣,请按如下操作:

SELECT COUNT(CASE response_val WHEN 4 THEN 1 END) AS `count`,
       `month`
FROM audit
WHERE response_key between 95 AND 98
GROUP BY `month`

演示:https://rextester.com/JEV40175

结果:

| count | month   |
-------------------
|     1 | 2019-09 |

编辑:

"Return a count when response_val=4 is found between response_key 95 to 98 corresponding to each uhid and group by month"

这意味着您也只需对 uhid 进行分组,如下所示:

SELECT COUNT(CASE response_val WHEN 4 THEN 1 END) AS `count`,
           `month`,uhid
FROM audit
WHERE response_key between 95 AND 98
GROUP BY `month`,uhid;

-- results:
count   month   uhid
0       2019-09 13256
2       2019-09 14569
1       2019-09 25689

或者,如果您希望每月将所有 uhid 计数放在一行中:

SELECT `month`,
       COUNT(CASE uhid WHEN 14569 THEN 1 END) AS `cnt_14569`,
       COUNT(CASE uhid WHEN 13256 THEN 1 END) AS `cnt_13256`,
       COUNT(CASE uhid WHEN 25689 THEN 1 END) AS `cnt_25689`
FROM audit
WHERE response_key between 95 AND 98 AND response_val=4
GROUP BY `month`,uhid

-- results:
month   cnt_14569   cnt_13256   cnt_25689
2019-09         2           0           0
2019-09         0           0           1    

演示:https://rextester.com/WXQ73318

<强>2。编辑:根据您的最新评论,以下内容可能会满足您的要求
(“列出每个月具有 response_val=4 的不同用户数量”):

SELECT COUNT(`count`) usrcnt, `month` FROM (
 SELECT COUNT(CASE response_val WHEN 4 THEN 1 END) AS `count`,`month`,uhid
 FROM audit WHERE response_key between 95 AND 98
 GROUP BY `month`,uhid
) tbl WHERE `count`>0 GROUP BY `month`;

-- or, even shorter:

SELECT COUNT(DISTINCT CASE response_val WHEN 4 THEN uhid END) AS `count`,`month`
FROM audit WHERE response_key between 95 AND 98
GROUP BY `month`;

-- same result from both queries:
usrcnt  month
     2  2019-09

演示:https://rextester.com/UGN73913

最新查询基于这些表值:

response_key   response_val    month    uhid
          95              4  2019-09   14569
          96              4  2019-09   14569
          97              5  2019-09   14569
          98              5  2019-09   14569
          95              5  2019-09   13256
          96              5  2019-09   13256
          97              5  2019-09   13256
          98              5  2019-09   13256
          95              5  2019-09   25689
          96              4  2019-09   25689
          97              5  2019-09   25689
          98              5  2019-09   25689

关于mysql - 计算某个值是否存在于一系列键中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58008607/

相关文章:

mysql - 我想从子查询的结果中计算男性和女性的总数。有没有mysql查询

MYSQL 检查重复项,仅当另一个字段为某个值时才插入

MYSQL 如何按 ID 对条目进行分组并创建包含分组条目的列?

PHP-PDO : Display all rows

php - 如何将多个上传的文件插入数据库

php - Jquery ajax mysql 在用户离开前更新

mysql - 如何从其他表获取数据?

php - Laravel - 外键约束的形成不正确

mysql - 从文件 MySQL 运行 SQL - 用户输入?

MySQL Case 语句问题