提前感谢您的任何想法,建议和建议!
系统:SQL Server 2008 R2
我需要为给定客户计算几个不同时间间隔(日期范围)内的回购次数,并将这些计数显示在一个表中。我将它与几个后续的公用表表达式 (cte) 一起工作,我最终将它们连接在一起。然而,这种方式很麻烦而且效率很低(就性能速度而言)。
然而,我期望的最短和最快的 SQL 代码由于多种原因无法正常工作,并且会返回错误消息,例如“子查询 (Select (count …….) 将返回多个值,因此“不能用作表达式”或另一个错误消息是:“聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。”请在下面找到示例表 ( WDB),期望的结果表(WDB_result)和需要改进的SQL代码。非常感谢所有可能提供帮助的人!
示例 WDB 表:
- CustomerID:客户编号
- InNo:发票编号
- OrderDate:订单日期
结果表 WDB_result:
列
A) 回购总数
B) 前 3 个月内的
回购次数 C) 前 6 个月内的
回购次数 D) 前 12 个月内的回购
次数 E) 最近 3 个月内
的回购次数 F) 回购次数过去 6 个月
G) 最近 12 个月的回购次数
用于计算列 A、B 和 E 的示例 SQL 代码:
SELECT
CustomerID
, COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Norepurchases_Total
, (SELECT (COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Count3
FROM WDB
WHERE OrderDate between MIN(OrderDate) and DATEADD(month, 3, MIN(OrderDate))
) as Norepurchases_1st_3months
, (SELECT (COUNT(InNo) OVER (PARTITION by CustomerID) -1) as Count3
FROM WDB
WHERE OrderDate between MAX(OrderDate) and DATEPART(y, DATEADD(m, -3, getdate()))
) as NoRepurchases_Last_3months
FROM WDB;