Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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统计每个成员资格子类型每小时的签入数_Mysql_Sql_Count_Case - Fatal编程技术网

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

我是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',
 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()