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`)
);