1

提前感谢您的任何想法,建议和建议!

系统: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;
4

2 回答 2

0

这是一个非常有趣的查询,如果您阅读有关多个聚合函数的这篇 stackoverflow 文章,我认为您所追求的可以实现。

应用与此问题中使用的相同概念应该可以解决您的问题。

于 2013-09-12T13:50:40.607 回答
0

通常我会在这种情况下做的是

SELECT  CustormerID,
        SUM(
            CASE
                WHEN OrderDate > @ThreeMonthsAgo AND OrderDate <= @CurrentDate
                    1
                ELSE 0
            END
           ) InLast3Months,        
        SUM(
            CASE
                WHEN OrderDate > @SixMonthsAgo AND OrderDate <= @ThreeMonthsAgo 
                    1
                ELSE 0
            END
           ) InLast3To6Months,
        ...
FROM YourTable
GROUP BY CustomerID

这将允许您事先将存储桶确定为变量,如图所示,然后计算有多少项目落在哪些存储桶中。

于 2013-09-12T13:49:36.693 回答