当在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/