Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询以获取除星期六以外的平均每日使用量_Mysql_Sql_Average - Fatal编程技术网

Mysql SQL查询以获取除星期六以外的平均每日使用量

Mysql SQL查询以获取除星期六以外的平均每日使用量,mysql,sql,average,Mysql,Sql,Average,我有以下输出: root@localhost [hatsize]> SELECT COUNT(*) AS VMS,sysname,DAYNAME(Start),DATE(Start) from complete_ev WHERE type = 's' GROUP BY DAYOFYEAR(Start),sysname ORDER BY VMS DESC; +-----+---------+----------------+-------------+ | VMS | sysname | D

我有以下输出:

root@localhost [hatsize]> SELECT COUNT(*) AS VMS,sysname,DAYNAME(Start),DATE(Start) from complete_ev WHERE type = 's' GROUP BY DAYOFYEAR(Start),sysname ORDER BY VMS DESC;
+-----+---------+----------------+-------------+
| VMS | sysname | DAYNAME(Start) | DATE(Start) |
+-----+---------+----------------+-------------+
|  85 | sv-esx5 | Monday         | 2013-09-16  |
|  63 | sv-esx6 | Wednesday      | 2013-09-18  |
|  60 | sv-esx5 | Monday         | 2013-09-09  |
|  55 | sv-esx6 | Monday         | 2013-09-16  |
|  52 | sv-esx6 | Monday         | 2013-09-09  |
|  51 | sv-esx5 | Wednesday      | 2013-09-18  |
|  50 | sv-esx7 | Wednesday      | 2013-09-11  |
|  44 | sv-esx4 | Monday         | 2013-09-09  |
|  43 | sv-esx4 | Tuesday        | 2013-09-10  |
|  34 | sv-esx4 | Tuesday        | 2013-09-17  |
|  34 | sv-esx7 | Monday         | 2013-09-09  |
|  34 | sv-esx4 | Monday         | 2013-09-16  |
|  34 | sv-esx7 | Tuesday        | 2013-09-17  |
|  34 | sv-esx6 | Wednesday      | 2013-09-11  |
|  34 | sv-esx7 | Monday         | 2013-09-16  |
|  30 | sv-esx5 | Wednesday      | 2013-09-11  |
|  30 | sv-esx5 | Thursday       | 2013-09-12  |
|  18 | sv-esx7 | Wednesday      | 2013-09-18  |
|  17 | sv-esx6 | Tuesday        | 2013-09-17  |
|  17 | sv-esx6 | Tuesday        | 2013-09-10  |
|  17 | sv-esx7 | Thursday       | 2013-09-12  |
|  13 | Pod130  | Wednesday      | 2013-09-11  |
|  10 | sv-esx4 | Friday         | 2013-03-22  |
|   9 | sv-esx4 | Sunday         | 2013-09-08  |
|   9 | sv-esx2 | Wednesday      | 2013-09-11  |
|   9 | sv-esx2 | Tuesday        | 2013-09-10  |
|   9 | Pod130  | Thursday       | 2013-09-12  |
|   9 | sv-esx4 | Wednesday      | 2013-09-11  |
|   9 | sv-esx5 | Friday         | 2013-09-13  |
|   9 | sv-esx4 | Friday         | 2013-09-13  |
|   9 | sv-esx2 | Monday         | 2013-09-09  |
|   9 | sv-esx5 | Tuesday        | 2013-09-10  |
|   2 | sv-esx2 | Friday         | 2012-07-27  |
+-----+---------+----------------+-------------+
33 rows in set (0.00 sec)
我喜欢得到每个系统名的每日平均值,即使在没有用的日子,另一个扭曲是我想排除星期六。我尝试了一些方法,但我看不出正确的公式。以下是该表的说明:

root@localhost [hatsize]> desc complete_ev;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| EventID  | int(16)      | YES  |     | NULL    |       |
| Start    | datetime     | YES  |     | NULL    |       |
| End      | datetime     | YES  |     | NULL    |       |
| Cname    | varchar(100) | YES  |     | NULL    |       |
| Template | varchar(100) | YES  |     | NULL    |       |
| pod      | varchar(100) | YES  |     | NULL    |       |
| sysname  | varchar(100) | YES  |     | NULL    |       |
| type     | char(10)     | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
这实际上是一种观点:

show create table complete_ev\G
*************************** 1. row ***************************
       View: complete_ev
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `complete_ev` AS select `e`.`EventID` AS `EventID`,`e`.`Start` AS `Start`,`e`.`End` AS `End`,`e`.`Name` AS `Cname`,`e`.`template` AS `Template`,`d`.`pod` AS `pod`,`d`.`name` AS `sysname`,`d`.`type` AS `type` from (`FutEv` `e` join `equip` `d` on((`e`.`EventID` = `d`.`EventID`))) where (`e`.`Status` = _latin1'i')

谢谢

一般来说,最好的方法是创建一个表,其中记录了2000-2025年间的每个日期。然后从这个表到主表做一个左连接,以获得所有的日期,如果它们是否有结果。然后在WHERE子句中排除星期六

假设您已经创建了一个名为date_table的表,其中包含您需要的所有日期。它还假设您有一个名为systems的表,其中包含要使用的系统列表

SELECT sysname, AVG(VMS)

FROM

(

SELECT COUNT(*) AS VMS, sys.sysname, DAYNAME(dt.date), dt.date 

FROM   date_table as dt

       , (SELECT sysname FROM systems) as sys

       LEFT JOIN complete_ev as ce 
       ON dt.date = DATE(ce.Start) AND sys.sysname = ce.sysname
       AND ce.type = 's'

WHERE  DAYNAME(dt.date) <> 'Saturday'

GROUP BY dt.date, sys.sysname 

) as x

GROUP BY sysname;

已编辑-将联接更改为左联接,并将ce.type从WHERE子句移动到联接。谢谢Tom。您有关于如何创建日期表的示例吗?还有,为什么我需要一个系统表?我会更新我的答案,告诉你如何创建一个日期表。对于系统,您需要在联接的左侧列出所有可能的系统,以便获得每个系统和日期的记录,而不管是否有结果。如果没有,可以这样使用:从complete\u ev中选择DISTINCT sysname。我通常会使用MS Excel中的公式为2000年至2025年的所有日期或类似日期创建INSERT语句。或者,您也可以使用Excel创建一个包含所有日期的csv文件,然后使用内嵌加载该文件。
CREATE TABLE `date_table` (
  `date` datetime DEFAULT NULL,
  `day_name` varchar(50) NOT NULL,
  PRIMARY KEY (`date`)
);