滚动12个月的数据-SQL

时间:2019-03-18 15:44:17

标签: mysql sql datetime

第一篇文章,所以请耐心等待:) 我想计算在特定月份下订单的客户数量,并找到他们在该月以及该月之前的11个月内下订单的数量。我真的不确定从哪里开始,所以将不胜感激任何帮助,我也意识到这很模糊,因此可能会有一些后续问题

我目前有一个客户ID,订单ID及其订单日期的表格,如下所示:

CustomerID	OrderID	  OrderDate
1234	      5678	    Dec-16
1234	      5679	    Jan-17
1235	      5680	    Jan-17

此数据将返回结果:

Date      CustomerCount   12MonthOrderCount
Jan 2017  2               3
Dec 2016  1               1

谢谢!

6 个答案:

答案 0 :(得分:0)

如果您使用的是T-SQL,则可以使用以下查询

从表1 t1中选择t1.CusttomerId 外用 (     从表2 t2中选择顶部1 t2.CId,t2.OrderId     其中t2.CID = t1.CustomerId和[Date] = specificDate )q

,并且您必须选择所需字段的数量。

还可以使用一些嵌套选择查询。

答案 1 :(得分:0)

由于您的问题有很多未知数,因此我冒昧地提出了许多假设。其中之一是您使用MSSQL。这段代码可能会为您指明一个可能的方向。

www.

答案 2 :(得分:0)

我认为您想为此see here

使用窗口功能

如果您还没有签出它们,我会这样做。

答案 3 :(得分:0)

要获取基表,请使用聚合:

select year(orderdate), month(orderdate), count(*) as num_orders
from orders o
group by year(orderdate), month(orderdate);

然后在12个月内可以执行以下操作:

select year(orderdate), month(orderdate), count(*) as num_orders,
       (select count(*)
        from orders o2
        where year(o2.orderdate) * 100 + month(o2.orderdate) > year(o.orderdate) * 100 + month(o.orderdate) - 12 and
              year(o2.orderdate) * 100 + month(o2.orderdate) <= year(o.orderdate) * 100 + month(o.orderdate)
       ) as num_12month_orders
from orders o
group by year(orderdate), month(orderdate);

您也可以使用变量来执行此操作,但这会变得有些复杂。

答案 4 :(得分:0)

我想您想找出本月有多少个订单。

  1. 弄清楚如何将OrderDate列中的文本转换为escolas["scholl_id"] = escolas["scholl_id"].replace(dict) 数据类型。

  2. 在WHERE语句中使用适当的日期算术。

1:这种表达式使您获得DATE,显示DATE中每月的第一天。此示例返回Mon yy

2018-02-01

因此,您可以使用这种查询来获取具有 SELECT STR_TO_DATE(CONCAT(' 1-','Feb-18'), '%e-%b-%y') 值的表

DATE

尝试一下。说服自己,它可以正确处理您的数据。

2:在WHERE子句中使用这些 SELECT CustomerID, OrderID, STR_TO_DATE(CONCAT(' 1-',OrderDate), '%e-%b-%y') OrderDate FROM table 值。为此,您需要知道the LAST_DAY(CURDATE()) function给出了本月的最后一天。而且您需要知道DATE是本月的第一天。

因此,要按当月的客户ID进行计数

LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH

类似地,这可以获取截至本月底的年度的计数。

     SELECT COUNT(*) CustomerCount, CustomerId
   FROM orders
  WHERE STR_TO_DATE(CONCAT(' 1-',OrderDate), '%e-%b-%y') >= 
                                      LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
    AND STR_TO_DATE(CONCAT(' 1-',OrderDate), '%e-%b-%y') < 
                                      LAST_DAY(CURDATE()) + INTERVAL 1 DAY
  GROUP BY CustomerId

然后,您需要生成整体结果集,要求您加入这两个子查询

     SELECT COUNT(*) 12MonthOrderCount, CustomerId
   FROM orders
  WHERE STR_TO_DATE(CONCAT(' 1-',OrderDate), '%e-%b-%y') >= 
                                      LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 YEAR
    AND STR_TO_DATE(CONCAT(' 1-',OrderDate), '%e-%b-%y') < 
                                      LAST_DAY(CURDATE()) + INTERVAL 1 DAY
  GROUP BY CustomerId

您可以在这里全部尝试。 https://www.db-fiddle.com/f/riyXu8MVjJKNWfWVQLmjUG/0

专业提示:到现在为止,显而易见的是,在进行此类操作时,将日期存储在 SELECT CustomerId, CustomerCount, 12MonthOrderCount FROM ( /* the query showing the full year data */ ) yr FROM ( /* the query showing the month data */ ) mon ON yr.CustomerId=mo.CustomerId 列中可以使工作变得更加轻松。

答案 5 :(得分:0)

您可以使用以下代码获得所需的结果。

select count (distinct CustomerID) as 'CustomerCount', count (OrderID) as '12MonthOrderCount' 
from orders
where  (OrderDate <= '2017-01-01' AND OrderDate >= '2016-01-01')