2017-10-10 13 views
1

Question de requête MySql:Combinaison de plusieurs requêtes de sélection issue

Etre un débutant en SQL J'ai la question suivante. Je dois m'efforcer de combiner 4 requêtes en une seule pour utilisation dans le logiciel de reporting. Le code fonctionne, mais le résultat n'est pas ce que je désire.

Essayé pour utiliser l'instruction UNION, cela affiche les comptes mais tous triés sous 1 'compte (*)' champ.

Je voudrais avoir 4 champs comme indiqué dans chaque requête (alarmes au total, total qui est reconnu, total qui est reconnu dans les 15min, total qui est reconnu après 15 min)

C'est mon code à ce jour:

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

Quelqu'un a-t-il une idée de comment trier chaque compte dans un champ séparé?

+0

Si vous souhaitez obtenir les résultats dans un enregistrement, la réponse de l'utilisation @ de P.Salmon, si vous les voulez dans plusieurs enregistrements, vous pouvez utiliser le mien . – Lamar

Répondre

1

Je pense que vous avez besoin d'une agrégation conditionnelle. par exemple

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

Merci pour votre réponse. C'est à propos de ce que je suis après. :-) – CaPsLoCkEr

0

Vous devez d'abord utiliser le même nom de colonne dans toutes les requêtes d'union. Deuxièmement, si vous souhaitez que tous aient le même nom, vous devez utiliser "UNION ALL" si les résultats ont des enregistrements en double.

En cas vous pouvez le faire:

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

Merci Lamar, votre réponse me donne un peu plus de perspicacité dans ce domaine. – CaPsLoCkEr