簡體   English   中英

如何合並來自同一表的兩個SQL查詢

[英]How to combine two sql queries from same table

我在表中有以下(示例)數據

值,日期,設備

我使用數據進行簡單的SLA計算,即在工作時間內多少次數據低於某個閾值。

目前,我運行以下兩個查詢,如下所示

select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times);

select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times);

因此,有兩個查詢,一個查詢沒有值<數字,一個查詢沒有值。

有幾個問題,是否有辦法將它們全部合並到一個查詢中,所以我可以看到總數據點和小於閾值的數據點的計數? 基本上返回三列,一列帶有計數,一列帶有低於閾值的計數和日期

除此之外,有沒有一種簡單的方法可以告訴mysql在返回數據時忽略周末?

謝謝,

使用UNION運算符。

更新后的查詢將如下所示:

(select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times))
UNION
(select count(*), DATE(times) from SLA where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times));

如您所寫,如果需要三列 (兩個計數和一個日期),請使用subselect而不是union:

select 
(select count(*) from SLA where device='some-dev' and DATE(times) = DATE(s.times) and  TIME(times) between '06:00:00' and '18:00:00' and value <150),
count(*), 
DATE(s.times) 
from SLA s
where device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times)

我沒有測試上面的查詢,因此可能需要進行一些調整,但是請參見一個簡化的工作示例

編輯:剛剛用一個(甚至)更有意義的查詢更新了鏈接的小提琴(一次)。

select count(*), DATE(time) from SLA where (device='some-dev' and DATE(time) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(time)) or (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(time) between '06:00:00' and '18:00:00' group by DATE(time));

怎么樣:

select count(*), DATE(times) from SLA 
where (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' and value <150 group by DATE(times))
or (device='some-dev' and DATE(times) between '2013-05-01' and '2013-05-31' and TIME(times) between '06:00:00' and '18:00:00' group by DATE(times));

我使用的是ms-sql,但大概可以執行以下操作:

select count(*), DATE(times), SUM(CASE WHEN value <150  THEN 1 ELSE 0 END)
from SLA
where device='some-dev'
and DATE(times) between '2013-05-01' and '2013-05-31'
and TIME(times) between '06:00:00' and '18:00:00'
group by DATE(times);

在mysql中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM