如何计算给定日期范围内的订单数

时间:2019-02-18 11:46:30

标签: sql sql-server

在编写sql查询以捕获按月分组的日期范围之间的活动订单数时需要一些帮助。也就是说,如果用户选择了2018年1月1日至2019年12月31日,则我必须按月显示有效订单数,即总共12条记录。

我正在查询结构如下的订单表

OrderID    CustomerFirstName   PurchaseDate   OrderEndDate  
1           XYZ                2018-01-01     9999-12-31
2           ABC                2018-02-02     2018-06-30
3           PQR                2018-06-01     2018-06-30
4           GHI                2018-01-01     2018-02-28

Order EndDate 9999-12-31永远不会结束订单。所有认为都存在于所有日期范围内的订单。

在我的用户体验中,如果我选择从1月到12月...结果应该

JAN ==> 2个订单 2月==> 3个订单=>订单ID为1,2,4。

本月FEB订单ID为1,2,4的原因被视为有效订单,因为 他们的结束日期是2月。

例如:ORDER ID:1的结束日期为9999-12-31,该日期永远不会结束。在所有日期范围内始终有效的订单

订单ID:2的结束日期为2018年6月30日,因此直到6月为止,他应被视为每个月都有有效订单

订单ID:截止日期为4的2月为2018-02-28订单ID有效的订单

预期产量

每月NoOfOrders

1月2日

2月3日

Month  NoOfOrder  
Jan      2   
Feb      3     

2 个答案:

答案 0 :(得分:1)

创建一个年月表(灵感来自this answer),然后将其与Order表结合起来

DECLARE @DateFrom datetime, @DateTo Datetime
SET @DateFrom = ' 2018-01-01'
SET @DateTo = '2018-12-31'

SELECT YearMonth, COUNT(*)
FROM (SELECT CONVERT(CHAR(4),DATEADD(MONTH, x.number, @DateFrom),120) + '-' + CONVERT(CHAR(2),DATEADD(MONTH, x.number, @DateFrom),110) As YearMonth,
             CONVERT(DATE, CONVERT(CHAR(4),DATEADD(MONTH, x.number, @DateFrom),120) + '-' + Convert(CHAR(2),DATEADD(MONTH, x.number, @DateFrom),110) + '-01', 23) fulldate
      FROM master.dbo.spt_values x
      WHERE x.type = 'P'        
        AND x.number <= DATEDIFF(MONTH, @DateFrom, @DateTo)) YearMonthTbl
LEFT JOIN  Orders o ON YEAR(fulldate) >= YEAR(purchaseDate) AND  MONTH(fulldate) >= MONTH(purchaseDate) and fulldate < = enddate
GROUP BY YearMonth

如果输入范围跨入新的一年,我决定在输出中也包含年份

这是完整性的输出

2018-01 2
2018-02 3
2018-03 2
2018-04 2
2018-05 2
2018-06 3
2018-07 1
2018-08 1
2018-09 1
2018-10 1
2018-11 1
2018-12 1

答案 1 :(得分:0)

第一部分-使用import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure(figsize = (20,20)) ax = fig.add_subplot(2, 1, 1, projection='3d') x = np.linspace(-1, 1, 300) # equivalent to f=R(x)*e^ix f = np.e**(15*1j*x - 18 * x**4) real_f = np.real(f) im_f = np.imag(f) # 1st plot ax.scatter(x, real_f, im_f, label='Ψ ', color='b') plt.title("The complex conjugate of Ψ\nis its mirror image.") ax.legend() ax.set_xlabel("x") ax.set_ylabel("Re") ax.set_zlabel("Im") # ax.set_axis_off() removes the box as well ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) ax.plot([x.min(), x.max()], [0,0], [0,0], color = 'black') ax.plot([0, 0], [real_f.min(), real_f.max()], [0, 0], color = 'black') ax.plot([0, 0], [0,0], [im_f.min(), im_f.max()], color = 'black') ax.text(0,0,0, '0') ax.text(x.max(),0,0, x.max()) ax.text(x.min(), 0, 0, x.min()) ax.text(0, real_f.max(), 0, real_f.max().round(2)) ax.text(0, real_f.min(), 0, real_f.min().round(2)) ax.text(0, 0, im_f.max(), imf_f.max().round(2)) ax.text(0, 0, imf_min(), im_f.min().round(2)) ax.axis('off') plt.show()

处理记录

您可以尝试以下操作。通过为orderenddate= '9999-12-31'设置一个OR条件,可以确保如果策略日期在边界之内,则永无休止的记录将出现在所有搜索中。

orderenddate = '9999-12-31'

第二部分:

  

sql查询以捕获日期范围之间的有效订单数   按月分组。

对于按月分组,您可以尝试以下操作。

SELECT * 
FROM   [order] 
WHERE  purchasedate >= @startdate 
       AND ( orderenddate <= @enddate 
              OR orderenddate = '9999-12-31' ) 

Online Demo

输出

  ;WITH numbersequence( number ) 
     AS (SELECT 1 AS Number 
         UNION ALL 
         SELECT number + 1 
         FROM   numbersequence 
         WHERE  number < 12) 

SELECT Sum(ct) ActiveOrderCount, 
       number  AS [month] 
FROM   (SELECT number, 
               CASE 
                 WHEN c.number >= Month(purchasedate) 
                      AND c.number <= Month(orderenddate) THEN 1 
                 ELSE 0 
               END ct 
        FROM   @order 
               CROSS JOIN numbersequence c 
        WHERE  purchasedate >= @startdate 
               AND ( orderenddate <= @enddate 
                      OR orderenddate = '9999-12-31' )) t 
GROUP  BY number 

假设:开始日期和结束日期属于同一年。否则,您还需要输入年份条件。