&引用;“不为空”;未在mySQL中生成所需的结果

&引用;“不为空”;未在mySQL中生成所需的结果,mysql,sql,group-by,mariadb,having,Mysql,Sql,Group By,Mariadb,Having,我正在尝试基于我的表构建一个报表。这是我的桌子: 下面是获得所需结果的SQL查询 SELECT `user`, SUM( CASE WHEN `event_time` >= '2021-04-01 00:00:00' AND `event_time` <= '2021-04-16 23:59:59' AND `sub_status` = 'TB' THEN pause_sec END ) AS 'Train

我正在尝试基于我的表构建一个报表。这是我的桌子:


下面是获得所需结果的SQL查询

SELECT
  `user`,
  SUM(
    CASE
      WHEN `event_time` >= '2021-04-01 00:00:00'
      AND `event_time` <= '2021-04-16 23:59:59'
      AND `sub_status` = 'TB'
      THEN pause_sec
    END
  ) AS 'Training Break',
  SUM(
    CASE
      WHEN `event_time` >= '2021-04-01 00:00:00'
      AND `event_time` <= '2021-04-16 23:59:59'
      AND `sub_status` = 'SB1'
      THEN pause_sec
    END
  ) AS 'Short Break 1',
  SUM(
    CASE
      WHEN `event_time` >= '2021-04-01 00:00:00'
      AND `event_time` <= '2021-04-16 23:59:59'
      AND `sub_status` = 'SB2'
      THEN pause_sec
    END
  ) AS 'Short Break 2',
  SUM(
    CASE
      WHEN `event_time` >= '2021-04-01 00:00:00'
      AND `event_time` <= '2021-04-16 23:59:59'
      AND `sub_status` = 'LB'
      THEN pause_sec
    END
  ) AS 'Long Break'
FROM
  `vicidial_agent_log`
GROUP BY `user`

请在此提供帮助或分享一篇有帮助的帖子。我一直在尝试查找,但不要对列名/别名使用单引号,因为例如
'Training Break'
在类似
'Training Break'的表达式中不为NULL
被解释为当然不为NULL的字符串文字。

在MySql中,可以使用倒勾来环绕列名。

此外,
Training Break
Short Break 1
Short Break 2
Long Break
列是聚合函数的结果,因此它们不能用于
WHERE
子句。改为使用
HAVING
子句。

最后,由于您希望这些列中至少有一列不为空的行,因此应使用运算符
,而不是

FROM
  `vicidial_agent_log`
GROUP BY `user`
HAVING `Training Break` IS NOT NULL
    OR `Short Break 1` IS NOT NULL
    OR `Short Break 2` IS NOT NULL
    OR `Long Break` IS NOT NULL
或:


首先,将
SUM()
表达式的公共部分移动到
WHERE
子句中

第二,修正日期逻辑,这样你就不会错过一秒钟

我还强烈建议使用不需要转义的列名。因此:

SELECT user,
      SUM(CASE WHEN sub_status` = 'TB' THEN pause_sec END) AS Training_Break,
      SUM(CASE WHEN sub_status = 'SB1' THEN pause_sec END) AS Short_Break_1,
      SUM(CASE WHEN sub_status = 'SB2' THEN pause_sec END) AS Short_Break_2,
      SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
      event_time < '2021-04-17'
GROUP BY user;
SQL非常强大,可以让您在聚合之前或之后进行过滤。但是,通常在聚合之前进行过滤(从性能角度来看)要好得多

我还建议您使用不需要转义的标识符。而且,除了字符串和日期文字外,不要对任何内容使用单引号

FROM
  `vicidial_agent_log`
GROUP BY `user`
HAVING COALESCE(`Training Break`, `Short Break 1`, `Short Break 2`, `Long Break`) IS NOT NULL
SELECT user,
      SUM(CASE WHEN sub_status` = 'TB' THEN pause_sec END) AS Training_Break,
      SUM(CASE WHEN sub_status = 'SB1' THEN pause_sec END) AS Short_Break_1,
      SUM(CASE WHEN sub_status = 'SB2' THEN pause_sec END) AS Short_Break_2,
      SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
      event_time < '2021-04-17'
GROUP BY user;
SELECT user,
      SUM(CASE WHEN sub_status` = 'TB' THEN pause_sec END) AS Training_Break,
      SUM(CASE WHEN sub_status = 'SB1' THEN pause_sec END) AS Short_Break_1,
      SUM(CASE WHEN sub_status = 'SB2' THEN pause_sec END) AS Short_Break_2,
      SUM(CASE WHEN sub_status = 'LB' THEN pause_sec END) AS Long_Break
FROM vicidial_agent_log
WHERE event_time >= '2021-04-01' AND
      event_time < '2021-04-17' AND
      sub_status IN ('TB', 'SB1', 'SB2', 'LB')
GROUP BY user;