【发布时间】:2013-09-16 22:28:48
【问题描述】:
提前感谢您的任何想法、建议和建议!
系统:SQL Server 2008 R2
我需要计算给定客户在几个不同时间间隔(日期范围)内的回购次数,并将这些计数显示在一个表格中。我将它与几个后续的公用表表达式 (cte) 一起工作,我最终将它们连接在一起。然而,这种方式很麻烦而且效率很低(就性能速度而言)。
我期望的 SQL 代码是最短和最快的,但是由于多种原因不能正常工作,并且会返回错误消息,例如 “子查询 (Select (count …….) 将返回多个值,因此“不能用作表达式” 要么 另一个错误消息是:“聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。” 请在下面找到示例表 (WDB)、所需结果表 (WDB_result) 和需要改进的 SQL 代码。非常感谢所有可能提供帮助的人!
示例 WDB 表:
- CustomerID:客户 ID
- 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;
【问题讨论】: