[英]Combining multiple select queries issue
MySql 查询问题:
作为 sql 的新手,我有以下问题。 我不得不将 4 个查询合并为一个以用于报告软件。 代码正在运行,但结果不是我想要的。
尝试使用 UNION 语句,这会显示计数,但都在 1 'count(*)' 字段下排序。
我希望每个查询中有 4 个字段(警报总数、确认总数、15 分钟内确认总数、15 分钟后确认总数)
到目前为止,这是我的代码:
select
count(*) 'Total alarms'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0'))
union
select
count(ack_time) 'Total Acknowledged'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0')
)
union
select
count(*) 'Total acknowledged within 15min'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0') AND
(TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)<60*15))
union
select
count(*) 'Total acknowledged after 15min'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0') AND
(TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)>60*15))
任何人都知道如何在单独的字段下对每个计数进行排序?
我认为你需要条件聚合。 例如
select
count(*) 'Total alarms',
sum(case when ack_time is not null then 1 else 0 end) as 'total acknowledged',
sum(case when (TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)<60*15) then 1 else 0 end) as 'Total acknowledged within 15min',
sum(case when (TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)>60*15) then 1 else 0 end) as 'Total acknowledged after 15min'
FROM alarminfo
where
alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0'
首先,您需要在所有联合查询中使用相同的列名。
其次,如果您希望所有名称都相同,那么您应该使用“UNION ALL”以防结果有重复记录。
在你的情况下,你可以这样做:
select
count(*) AS 'count', 'Total alarms' As 'label'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0'))
union
select
count(ack_time) AS 'count', 'Total Acknowledged' As 'label'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0')
)
union
select
count(*) AS 'count', 'Total acknowledged within 15min' AS 'label'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0') AND
(TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)<60*15))
union
select
count(*) AS 'count', 'Total acknowledged after 15min' AS 'label'
FROM alarminfo
where
((alarminfo.set_time>='2017-09-01 00:00:00.0' AND alarminfo.set_time<'2017-09-15 23:59:59.0') AND
(TIMESTAMPDIFF(SECOND,alarminfo.set_time ,alarminfo.ack_time)>60*15))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.