2014-10-06 82 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子查询,它会很难管理。