MySQL统计每个成员资格子类型每小时的签入数
我是MySQL的新手,所以请容忍我潜在的失误。我需要创建一个查询,显示我们不同的成员子类型以及每个子类型在给定的一天每小时签入的次数。以下是我到目前为止的想法:MySQL统计每个成员资格子类型每小时的签入数,mysql,sql,count,case,Mysql,Sql,Count,Case,我是MySQL的新手,所以请容忍我潜在的失误。我需要创建一个查询,显示我们不同的成员子类型以及每个子类型在给定的一天每小时签入的次数。以下是我到目前为止的想法: SELECT customers.CUSTOMER_CUSTOM_TYPE AS Subtype, COUNT(CASE WHEN checkins.POSTDATE BETWEEN '%17:00:00' AND '%17:59:59' THEN 1 ELSE 0 END) AS '5pm', COUN
SELECT
customers.CUSTOMER_CUSTOM_TYPE AS Subtype,
COUNT(CASE
WHEN checkins.POSTDATE BETWEEN '%17:00:00' AND '%17:59:59' THEN 1
ELSE 0
END) AS '5pm',
COUNT(CASE
WHEN checkins.POSTDATE BETWEEN '%18:00:00' AND '%18:59:59' THEN 1
ELSE 0
END) AS '6pm',
COUNT(CASE
WHEN checkins.POSTDATE BETWEEN '%19:00:00' AND '%19:59:59' THEN 1
ELSE 0
END) AS '7pm'
FROM
checkins,
customers
WHERE
checkins.CUSTOMER_ID = customers.CUSTOMER_ID
AND checkins.POSTDATE LIKE '2017-10-05%'
GROUP BY customers.CUSTOMER_CUSTOM_TYPE;
为了简洁起见,我只包括了三个小时。我每小时都能得到相同的数字,尽管后发日期有所改变。表的设置正确:
在其他更简单的查询中,我通过计算给定时间段内客户的签入ID来计算签入次数。客户每次签入时都会获得不同、唯一的签入ID。我这样做对吗?有没有更简单的方法?感谢您的帮助 学习使用正确的
join
语法。切勿在from
子句中使用逗号
查询的更简单版本可能是:
SELECT cu.CUSTOMER_CUSTOM_TYPE AS Subtype,
SUM( hour(ch.POSTDATE) = 17) AS `5pm`,
SUM( hour(ch.POSTDATE) = 18) as `6pm`,
SUM( hour(ch.POSTDATE) = 19) as `7pm`
FROM checkins ch JOIN
customers cu
ON ch.CUSTOMER_ID = cu.CUSTOMER_ID
WHERE DATE(ch.POSTDATE) = '2017-10-05'
GROUP BY cu.CUSTOMER_CUSTOM_TYPE;
注:
- 使用表别名。它们使查询更易于编写和读取
- 不要对日期和时间使用字符串比较。这将提取日期进行比较(如果该列上有索引,则会有其他选项)
模式不适用于LIKE
之间的
。我将其替换为更简单的
HOUR()
- 这使用了一个MySQL快捷方式,将布尔表达式视为数字上下文中的数字——因此不需要
case
客户id
,房间
,以及入住时间
。然后,您提到的checkin\u id
可以是插入此表时生成的主键值。与其将这些信息按时间排序到一个类似于图表的表格中,只需跟踪这三条数据就有很大的价值
接下来,不要使用很多情况:使用groupby
语句。如果需要用房间来描绘,那么它看起来有点像这样:
SELECT count(*) as num, hour(check_in_time) as hr
FROM checkins
Group By room, hr
这将返回所有时间内所有房间每小时的签入计数。如果您希望按天或年份细分,只需将时间函数添加到Select和Group语句。COUNT()
应为SUM()
。