2017-06-19 96 views
0

我有像下面的表格格式。如何使用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查询。

+0

值得一读https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users – RiggsFolly

+1

你有没有试图写一个查询呢? – RiggsFolly

+1

请阅读[我可以询问哪些主题](http://stackoverflow.com/help/on-topic) 和[如何提出一个好问题](http://stackoverflow.com/help/how-to - 问) 和[完美的问题](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) 以及如何创建[最小,完整和可验证示例] (http://stackoverflow.com/help/mcve) ** SO不是**免费的编码服务___我们尝试修复您的代码,我们不写你的代码____ – RiggsFolly

回答

0

您可以使用WEEKOFYEAR()函数:

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

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

我怀疑这将是可怕慢。也许更好的方法是查找当前周的开始和结束日期,然后使用它们对C_Date执行<和>。

米克

+0

需要本周的数据。 –

+1

你为什么不开始写一个SELECT,让我们看看你得到了什么? – Mick

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 

注:

我们需要返回七 “日” 的值(周日至周六一个行源),否则,当那天没有行时,我们不能从表中返回当天的“零”计数。

我们需要定义“当前周”。上面的查询使用当前日期,并减去七天。如果此查询在星期三运行,我们将在星期三至星期二前七天收到。如果你的“本周”的定义比不同,则使用产生在报告期开始时的一个DATETIME值,而本报告期后的第一秒(代替DATE(NOW)) + INTERVAL -7 DAYDATE(NOW)))表达


随访

寻址评论:“只拿到周一的记录,所有其他人都不对”

请明白这一点:StackOverflow上是查询和代码写作服务。上述 答案图示查询模式的例子,满足查询需要克服的最大驼峰之一:

  • 返回零个计数行不存在

由于上面提到的答案(在说:)的那条线下面),我们需要一个“当前周”的实际规范。当“今日”是星期二时,这意味着什么,'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' 

什么日期文字可用于查询返回th预期的结果?因此,查询不是“只得到星期一的记录,所有其他人都不对”[原文如此]。

我们可以使用一个简单的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 

一旦我们返回“开始”和范围的“结束”的表达,我们可以利用那些在另一个查询。像上面的一个...

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

是的,你正确的...... –

+0

只得到星期一的记录,所有其他人都不对 –