Mysql 简化SQL语句
以下是表event_temperature,记录是员工在特定时间的温度记录:Mysql 简化SQL语句,mysql,sql,Mysql,Sql,以下是表event_temperature,记录是员工在特定时间的温度记录: event_id, dept_name, event_card, temp, event_time 9394cf697afa11ea9562040e3c15002f, BU003, F9011101, 36.7000, 2020-04-08 06:50:01 9394cecc7afa11ea9562040e3c15002f, BU003, F9011101, 37.2000, 2020-04-11 07:50:17
event_id, dept_name, event_card, temp, event_time
9394cf697afa11ea9562040e3c15002f, BU003, F9011101, 36.7000, 2020-04-08 06:50:01
9394cecc7afa11ea9562040e3c15002f, BU003, F9011101, 37.2000, 2020-04-11 07:50:17
907ebe3f7afa11ea9562040e3c15002f, BU003, W4204094, 40.3000, 2020-04-10 08:35:45
8fdf42a07afa11ea9562040e3c15002f, BU007, F1644194, 36.1600, 2020-04-07 19:58:08
8e9bb6fd7afa11ea9562040e3c15002f, BU003, F2150829, 35.8000, 2020-04-11 12:45:23
现在,我想得到今天每个部门这3类员工的数量:
总计:所有温度
异常:温度在37.3和42之间
可疑:温度在36.5和37.3之间
我已经编写了此SQL,但它看起来很复杂:
选择
ee1.部门名称,ee1.总计,ee2.异常,ee3.可疑
从…起
选择
ee.dept_name,将不同的ee.event_卡计为总计
从…起
选择不同的
et.部门名称,
事件卡,
案例
当et.temp在36.5和37.3之间时,则“可疑”
当et.temp在37.3和42之间时,则为“异常”
否则“正常”
以类型结尾_
从…起
`whsgdb开发事件温度et
哪里
东部时间“2020-04-11 00:00:00”和“2020-04-11 23:59:59”之间的事件时间
按ee.dept\u名称分组ee1
左连接
选择
ee.dept\u name、COUNTDISTINCT ee.event\u卡异常
从…起
选择不同的
et.部门名称,
事件卡,
案例
当et.temp在36.5和37.3之间时,则“可疑”
当et.temp在37.3和42之间时,则为“异常”
否则“正常”
以类型结尾_
从…起
`whsgdb开发事件温度et
哪里
东部时间“2020-04-11 00:00:00”和“2020-04-11 23:59:59”之间的事件时间
哪里
ee.type u=‘异常’
按ee.dept\u名称ee2对ee2进行分组。dept\u名称=ee1.dept\u名称
左连接
选择
ee.dept\u name,COUNTDISTINCT ee.event\u卡作为嫌疑犯
从…起
选择不同的
et.部门名称,
事件卡,
案例
当et.temp在36.5和37.3之间时,则“可疑”
当et.temp在37.3和42之间时,则为“异常”
否则“正常”
以类型结尾_
从…起
`whsgdb开发事件温度et
哪里
东部时间“2020-04-11 00:00:00”和“2020-04-11 23:59:59”之间的事件时间
哪里
ee.type u=‘可疑’
按ee.dept\u名称ee3在ee3上分组。dept\u名称=ee1.dept\u名称
结果:
dept_name, total, abnormal, suspect
BU003, 3227, null, 6
BU007, 247, null, 2
BU011, 16, null, 1
请帮助我简化sql语句,或者有更简单的方法吗?使用条件聚合:
SELECT
dept_name,
COUNT(DISTINCT event_card) AS total,
COUNT(DISTINCT CASE WHEN temp BETWEEN 37.3 AND 42 THEN event_card END) AS abnormal,
COUNT(DISTINCT CASE WHEN temp BETWEEN 36.5 AND 37.3 THEN event_card END) AS suspect
FROM event_temperature
WHERE
event_time >= CURDATE() && event_time < (CURDATE() + INTERVAL 1 DAY)
GROUP BY
dept_name
ORDER BY
dept_name;
使用条件聚合:
SELECT
dept_name,
COUNT(DISTINCT event_card) AS total,
COUNT(DISTINCT CASE WHEN temp BETWEEN 37.3 AND 42 THEN event_card END) AS abnormal,
COUNT(DISTINCT CASE WHEN temp BETWEEN 36.5 AND 37.3 THEN event_card END) AS suspect
FROM event_temperature
WHERE
event_time >= CURDATE() && event_time < (CURDATE() + INTERVAL 1 DAY)
GROUP BY
dept_name
ORDER BY
dept_name;
每个员工可能有多个记录,在哪里添加差异当你应该计算不同的事件卡时,请查看更新的答案。谢谢,这太棒了,它可以工作。您忘记从事件中写入:每个员工可能有多个记录,在哪里添加差异当您应该计算不同的事件卡时,请查看更新的答案。谢谢,这太棒了,它很有效。您忘记从事件中写入: