如何在mysql查询中使用count和case条件?

aor9mmx1  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(442)
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

我的要求是我想要一个特定月份的会话计数。从上面的查询中,我得到了错误的计数。当我检查下面的查询时,它是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语句中使用日期条件。请帮我查询这个案例陈述。 totalSessions 应返回0。

qv7cva1a

qv7cva1a1#

你应该使用 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

sql小提琴
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 |
gcxthw6b

gcxthw6b2#

下面是一个示例,说明当前查询在没有 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;

这是一个演示。

相关问题