如何使用mysql查询获取每周报告?

时间:2017-06-19 15:29:45

标签: mysql

我的表格格式如下。

Customer_ID   Result C_Date
1              2      2017-06-19 15:49:00
1              3      2017-06-20 15:49:00
1              3      2017-06-21 15:49:00
2              1      2017-06-15 15:49:00
3              2      2017-06-15 15:49:00
1              2      2017-06-19 19:49:00
1              3      2017-06-21 23:49:00

我需要获取Customer_ID的所有记录为1和当前周的结果。 例如

Customer_ID  Day     Total(COUNT)
1            Sunday    0
1            Monday    2
1            Tuesday   1
1            Wednesday 1
1            Thursday  0
1            Friday    0
1            Saturday  0

我在mysql查询中需要这种类型的结果。

2 个答案:

答案 0 :(得分:0)

您可以使用WEEKOFYEAR()函数:

http://www.w3resource.com/mysql/date-and-time-functions/mysql-weekofyear-function.php

所以,做一些像WHERE WEEKOFYEAR(C_DATE)= WEEKOFYEAR(NOW())

我怀疑这会非常慢。也许更好的方法是找到当前周的开始和结束日期,然后使用它们来做<和>反对C_Date。

米克

答案 1 :(得分:0)

这样的东西会返回指定的结果:

SELECT c.customer_id   AS `Customer_ID`
     , d.day           AS `Day`
     , COUNT(1)        AS `Total(COUNT)`
  FROM ( SELECT 1 AS customer_id ) c
 CROSS
  JOIN ( SELECT 1 AS `dow`, 'Sunday' AS `day`
         UNION ALL SELECT 2, 'Monday'
         UNION ALL SELECT 3, 'Tuesday'
         UNION ALL SELECT 4, 'Wednesday'
         UNION ALL SELECT 5, 'Thursday'
         UNION ALL SELECT 6, 'Friday'
         UNION ALL SELECT 7, 'Saturday'
       ) d
  LEFT
  JOIN mytable t
    ON t.customer_id = c.customer_id
   AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY
   AND t.c_date <  DATE(NOW())
   AND DAYOFWEEK(t.c_date) = d.dow
 GROUP BY c.customer_id, d.dow
 ORDER BY c.customer_id, d.dow

注:

我们需要一个返回7&#34; Day&#34;价值(周日至周六),否则,我们无法返回&#34;零&#34;当那天没有一行时,从表中计算当天。

我们需要定义&#34;当前周&#34;。上面的查询使用当前日期,并减去七天。如果此查询在星期三运行,我们将获得前七天,周三至周二。如果您对&#34;当前周&#34;的定义与此不同,然后使用在报告期间开始时生成DATETIME值的表达式,以及在报告期间后的第一秒(代替DATE(NOW)) + INTERVAL -7 DAYDATE(NOW))

<强>后续

解决评论:&#34;只获取星期一记录,其他所有记录都不正确&#34;

请理解这一点:StackOverflow 是一个查询和代码编写服务。 上面的答案说明了一个查询模式的示例,解决了查询需要解决的最大问题之一:

  • 为不存在的行返回零计数

正如上面提到的答案(在说明:)的那条线下,我们需要一个实际的规格,用于&#34;当前周&#34;。这意味着什么时候&#34;今天&#34;是星期二,'2017-06-20'。指定的日期范围是多少?如果今天是星期五或星期天,这意味着什么呢?

一旦我们有了定义,我们就可以编写表达式,它们将返回开始和结束日期值。

换句话说,......采取这部分问题:

   AND t.c_date >= DATE(NOW()) + INTERVAL -7 DAY
   AND t.c_date <  DATE(NOW())

用以下内容代替:

   AND t.c_date >= '2017-06-14'
   AND t.c_date <  '2017-06-21'

或者像这样:

   AND t.c_date >= '2017-06-18'
   AND t.c_date <  '2017-06-25'

可以使用 literals 的日期,以便查询返回预期的结果?因此查询不是&#34; 只获得星期一记录,所有其他人都不正确&#34; [原文如此]。

我们可以使用简单的SELECT语句来测试表达式。我们可以使用用户定义的变量代替NOW()来测试NOW()的各种可能值。例如:

SET @tday = '2017-06-21 12:34' ;

SELECT DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-1 DAY AS sd
     , DATE(@tday) - INTERVAL DAYOFWEEK(@tday)-8 DAY AS ed

一旦我们有表达式返回&#34; start&#34;和&#34;结束&#34;在范围中,我们可以在另一个查询中使用它们。就像上面那个......

   AND t.c_date >= DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-1 DAY
   AND t.c_date <  DATE(NOW()) - INTERVAL DAYOFWEEK(NOW())-8 DAY