[英]How to use count with CASE condition in a MySQL query?
SELECT
COUNT(
CASE WHEN ( DATE(igs.start_date) >= DATE('2020-05-01')
AND DATE(igs.start_date) <= DATE('2020-05-31')
THEN igs.id
ELSE 0
END
) AS totalSessions
FROM
`ignite_session` igs
我的要求是我想要特定月份的 session 计数。 从上面的查询中,我得到了错误的计数。 当我检查以下查询时,它是 0。
SELECT
COUNT(id)
FROM
ignite_session igs
WHERE
DATE(igs.start_date) >= DATE('2020-05-01')
AND DATE(igs.start_date) <= DATE('2020-05-31')
第一个查询是复杂查询的一小部分。 我不想在 where 语句中使用日期条件。 请帮我处理这个 CASE STATEMENT 查询。 totalSessions
应该返回 0。
在其他情况下,您应该使用NULL
。
喜欢:
SELECT
COUNT(
CASE WHEN (DATE(igs.start_date) >= DATE('2020-05-01')
AND DATE(igs.start_date) <= DATE('2020-05-31'))
THEN igs.id
ELSE NULL
END
) AS totalSessions
FROM
`ignite_session` igs
MySQL 5.6 架构设置:
CREATE TABLE t1
(`c1` int)
;
INSERT INTO t1
(`c1`)
VALUES
(1),
(2),
(3),
(4),
(5)
;
查询 1 :
select count(case when c1 > 2 then 1 else null end) as nb_count from t1
结果:
| nb_count |
|----------|
| 3 |
这是您当前查询在没有COUNT
的情况下为您提供的示例:
SELECT
CASE WHEN DATE(igs.start_date) >= DATE('2020-05-01')
AND DATE(igs.start_date) <= DATE('2020-05-
31') THEN igs.id ELSE 0
END
AS totalSessions
FROM
`ignite_session` igs;
+---------------+
| totalSessions |
+---------------+
| 0 |
| 0 |
| 0 |
| 0 |
+---------------+
*4 row(s) returned.
因此,使用COUNT
,它创建了返回的行,这就是为什么即使您在该日期范围内没有任何数据,您也会在totalSessions
中得到一些东西。 但只要对查询稍作改动,就可以获得正确的结果。 而不是COUNT
,使用SUM
。 像这个例子:
SELECT
SUM(CASE WHEN DATE(igs.start_date) >= DATE('2020-05-01') AND DATE(igs.start_date) <= DATE('2020-05-
31') THEN 1 -- change to 1 instead of igs.id
ELSE 0
END)
AS totalSessions
FROM
`ignite_session` igs;
或者更短的版本(类似于 Akina 在评论中的建议):
SELECT SUM(DATE(igs.start_date) >= '2020-06-01' AND DATE(igs.start_date) <= '2020-05-31')
FROM ignite_session igs;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.