在编写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
答案 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' )
输出
;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
假设:开始日期和结束日期属于同一年。否则,您还需要输入年份条件。