2017-10-10 139 views
1

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)) 

任何人都知道如何在单独的字段下对每个计数进行排序?

+0

如果你想在一个记录的结果,使用@ P.Salmon的回答,如果你希望他们在多条记录,你可以用我的。 – Lamar

回答

1

我认为你需要条件聚合。例如

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' 
+0

谢谢你的回答。这是关于我所追求的。 :-) – CaPsLoCkEr

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)) 
+0

谢谢拉马尔,你的回答给了我更多的见解。 – CaPsLoCkEr