繁体   English   中英

结合多个选择查询问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM