【问题标题】:In single select statement count number of orders within several time ranges在单个 select 语句中计算几个时间范围内的订单数
【发布时间】: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;

【问题讨论】:

    标签: sql tsql date count


    【解决方案1】:

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

    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
    

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

    【讨论】:

      【解决方案2】:

      这是一个非常有趣的查询,我认为如果您阅读 multiple aggregate functions 上的这篇 stackoverflow 文章,您所追求的就可以实现。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        相关资源
        最近更新 更多