2017-10-10 6 views
1

MySqlクエリ質問:複数の選択クエリを組み合わせて発行する

SQLで初心者になる私は次の質問があります。 レポートソフトウェアで使用するために、4つのクエリを1つにまとめるのは面倒です。コードは機能していますが、その結果は私が望むものではありません。

UNIONステートメントを使用しようとしましたが、これはカウントを表示しますが、すべて1 'カウント(*)'フィールドの下にソートされています。

各クエリに述べたように、私は(総アラームの合計は認め、15分以内に認め合計、15分後に認め合計)の4つのフィールドを持っていると思い

これは、これまでの私のコードです:

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

使用すると、1つのレコードの結果を取得したい場合は、使用する@ 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

最初に、すべてのユニオンクエリで同じ列名を使用する必要があります。

第2に、すべてが同じ名前になりたい場合は、結果に重複レコードがある場合に「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

Lamarに感謝します。あなたの答えは私にこれについてのいくつかの洞察を与えてくれます。 – CaPsLoCkEr

関連する問題