2014-10-06 106 views
-1

我有關於多個服務器的信息的數據庫:where子句SQL和顯示NULL值

mysql> select DATE_FORMAT(timestamp,'%M %Y') as 'Mois',AVG(value_perf) as 'moy' from info WHERE  server = 'pi4' GROUP BY MONTH(timestamp); 
+----------------+-----------+ 
| Mois   | moy  | 
+----------------+-----------+ 
| June 2014  | 98.465500 | 
| July 2014  | 98.854516 | 
| August 2014 | 98.227097 | 
| September 2014 | 95.008667 | 
| October 2014 | 77.880000 | 
+----------------+-----------+ 
5 rows in set (0.00 sec) 

然而,每個PI服務器具有不同的起始日期(在六月PI4的統計信息,但PI1統計一月)

實施例:

mysql> select DISTINCT DATE_FORMAT(timestamp,'%M %Y') as 'Mois' from info ORDER BY timestamp; 
+----------------+ 
| Mois   | 
+----------------+ 
| January 2014 | 
| February 2014 | 
| March 2014  | 
| April 2014  | 
| May 2014  | 
| June 2014  | 
| July 2014  | 
| August 2014 | 
| September 2014 | 
| October 2014 | 

+ ---------------- +

,我會立查詢得到每個服務器的平均分數,但是用最大的視圖,包括NULL。

示例PI4:

+----------------+-----------+ 
| Mois   | moy  | 
+----------------+-----------+ 
| January 2014 | NULL  | 
| February 2014 | NULL  | 
| March 2014  | NULL  | 
| April 2014  | NULL  | 
| May 2014  | NULL  | 
| June 2014  | 98.465500 | 
| July 2014  | 98.854516 | 
| August 2014 | 98.227097 | 
| September 2014 | 95.008667 | 
| October 2014 | 77.880000 | 
+----------------+-----------+ 

PS:這裏是數據庫結構

mysql> select * from info limit 10; 
+----+------------+-----------+------------+-------------+ 
| id | timestamp | server | value_perf | value_avail | 
+----+------------+-----------+------------+-------------+ 
| 45 | 2014-06-11 | pi4  |  98.33 |  99.91 | 
| 46 | 2014-06-12 | pi4  |  97.92 |  100.00 | 
| 52 | 2014-06-18 | pi4  |  98.15 |  99.97 | 
| 54 | 2014-06-20 | pi  |  98.33 |  99.94 | 
+----+------------+-----------+------------+-------------+ 

的一個例子,我想每月的平均,與不可用幾個月NULL值。

我該如何得到這個?

謝謝

+1

刪除了SQL服務器的標籤,因爲這個問題是關於MySQL – Lamak 2014-10-06 16:08:19

+0

此選擇選項,這不作品: 的mysql>選擇DATE_FORMAT(時間戳, '%M%Y')爲 '指明MyDate',AVG(value_perf) (timestamp,'%M%Y')作爲'Mois'從信息ORDER BY timestamp)GROUP BY MONTH(timestamp);作爲'moy'from info WHERE server ='pi4'AND'mydate' 空集(0.00秒) – Chris 2014-10-06 16:10:58

+0

編輯你的問題,並用你試過的查詢進行更新。 – 2014-10-06 16:14:15

回答

0

最簡單的方法來實現你想要的是創建一個日期查找表。類似於

CREATE TABLE `month_lookup` (
    `month_year` varchar(30), 
    `st` datetime, 
    `en` datetime, 
    PRIMARY KEY (`month_year`), 
    KEY `st` (`st`) 
    KEY `end` (`end`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

然後爲每個月的開始和結束日期插入數據。繼續並將其填充1970年至2070年或某事。這張桌子可以派上用場。一個例子行將看起來像

month-year  st      en 
Jan-2014  2014-01-01 00:00:00  2014-01-31 23:59:59 

那麼你可以做的是這樣的:

SELECT a.month_year, avg(b.value_perf) AS moy 
FROM month_lookup AS a 
LEFT JOIN info AS b 
ON b.timestamp BETWEEN a.st AND b.en 
GROUP BY a.month_year, b.server; 

在month_lookup表中的指標可能會更好,如果你沒有st_end(ST,EN),而不是st和en分開,但是你必須測試一下......如果一個複合索引可以幫助你使用join ... between子句或者不是

無論如何創建一個month_lookup表,並在左連接中使用它......可能是您的最佳選擇。否則,你會做聯合ond子查詢,它會很難管理。