Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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查询按10天周期生成报告_Mysql_Sql - Fatal编程技术网

MySQL查询按10天周期生成报告

MySQL查询按10天周期生成报告,mysql,sql,Mysql,Sql,我有一张这样的桌子 id | user_id | point | created_at ------------------------------------------- 1 | 1 | 10 | 2015-08-03 00:08:25 2 | 3 | 20 | 2015-08-01 00:08:25 3 | 4 | 30 | 2015-08-13 00:08:25 4 | 3 | 10 | 20

我有一张这样的桌子

id  | user_id | point | created_at
-------------------------------------------
1   | 1       | 10    | 2015-08-03 00:08:25 
2   | 3       | 20    | 2015-08-01 00:08:25 
3   | 4       | 30    | 2015-08-13 00:08:25 
4   | 3       | 10    | 2015-08-25 00:08:25 
5   | 2       | 20    | 2015-09-02 00:08:25 
6   | 1       | 10    | 2015-09-14 00:08:25 
7   | 4       | 50    | 2015-09-22 00:08:25 
8   | 2       | 80    | 2015-09-30 00:08:25 
9   | 1       | 30    | 2015-10-02 00:08:25 
10  | 5       | 90    | 2015-10-02 00:08:25 
我可以生成一个查询来生成这样的结果吗

start_date | end_date   | total_point_100_or_more | total_point_less_than_100
------------------------------------------------------------------------------
2015-08-01 | 2015-08-10 | 3 User                  | 7 User
2015-08-11 | 2015-08-20 | 8 User                  | 5 User
2015-08-21 | 2015-08-30 | 10 User                 | 5 User
2015-08-31 | 2015-09-09 | 4 User                  | 6 User

我现在没有任何代码行,因为我完全不知道从哪里开始。

我没有测试过这个,也不能,因为您的示例答案与您的示例数据不一致,但下面类似的内容应该可以工作。在这里,我假设您想知道用户在每个时间段的总分是如何高于或低于100分的

SELECT  start_date,
        DATEADD(day, 9, start_date) as end_date,
        SUM(CASE WHEN period_points >= 100 THEN 1 ELSE 0 END) as total_point_100_or_more,
        SUM(CASE WHEN period_points < 100 THEN 1 ELSE 0 END) as total_point_less_than_100
FROM (
        SELECT  start_date,
                user_id,
                SUM(point) as period_points
        FROM (
                SELECT  DATEADD(
                                day,
                                DATEDIFF(day, '2015-08-01 00:00:00', created_at)/10*10,
                                '2015-08-01 00:00:00'
                        ) as start_date,
                        id,
                        user_id,
                        point
                FROM    points
        ) AS p
        GROUP BY start_date, user_id
) as q
GROUP BY start_date

请注意,我没有像您的示例中那样将整数计数转换为文本和追加用户。

如果在8月4日创建的MINU是什么。从那以后它能分成10块吗?魔鬼在细节中你需要创建一个存储过程来读取你的表,并执行你所需的操作,如筛选和求和10天的数据并将它们放入一个表中,然后你可以读取该表作为你的输出,你可以每天安排这个存储过程来更新你最近的记录。@Drew,如果开始日期是8月4日,那么结束日期将是8月13日。@GauravLad,因此我无法仅通过一次查询生成此结果?@otezz:如果有办法,那么每次启动相同的查询以获取数据是不好的,由于它有开始日期和结束日期,所以您的数据在8月份(即9月份)不会更改。因此,为什么每次都要计算8月份的数据,最好使用存储过程只运行一次来维护计算。所以我觉得使用存储过程将是一种优化的方式。