计算填充临时表后的平均值

问题描述:

我的任务是确定我们的客户与我们保持的平均时间长度。 (特别是从他们成为客户的日期,到他们最后一次下单的时间。)计算填充临时表后的平均值

我不是100%确定我正在做这件事,但我的想法是收集我们进入客户的日期数据库,然后转到订单表并获取他们最近的订单日期,将它们转储到临时表中,然后计算这两个日期之间的时间长度,然后根据该数字计算平均值。

(我必须做一些其他的抖动抖动时间的东西,但这是一个踢我的屁股) 最终目标是能够说“平均我们的客户坚持我们4年,3个月“。 (或任何数据显示的那样。)

SELECT * INTO #AvgTable 
     FROM(
     SELECT DISTINCT (c.CustNumber) AS [CustomerNumber] 
     , COALESCE(convert(VARCHAR(10),c.OrgEnrollDate,101),'') AS [StartDate] 
     , COALESCE(CONVERT(VARCHAR(10),MAX(co.OrderDate),101),'')AS [EndDate] 
      ,DATEDIFF(DD,c.OrgEnrollDate, co.OrderDate) as [LengthOfTime] 

     FROM dbo.Customer c 
     JOIN dbo.CustomerOrder co ON c.ID = co.CustomerID 

     WHERE c.Archived = 0 
     AND co.Archived =0 
     AND c.OrgEnrollDate IS NOT NULL 
     AND co.OrderDate IS NOT NULL 

     GROUP BY c.CustNumber 
     , co.OrderDate 2 
     ) 

    --This is where I start falling apart 



     Select AVG[LengthofTime] 

     From #AvgTable 
+0

除了你的sql语句的技巧之外,要小心你得出的结论:4年前注册的一些客户今天发布一个订单可能'坚持'到你的公司远远少于访问你店铺的客户过去2个月订购5次。至少在报告中添加差异。甚至更好,在你的分析中纳入订单的频率(例如,聚合类型的客户:'稀有访客','约翰·多伊','购物者')。当然,所有的意见,恕我直言。 – collapsar

我的猜测是,既然你是存储在一个临时表中的数据,该datediff的整数结果隐式转换回日期时间(不能平均)。

不要将平均值存储在临时表中(甚至没有临时表,但这是完全不同的对话)。只要在你的选择中做差异。

+0

不DateDiff返回一个INT? MSDN表示它的确如此,所以我认为当它插入到Temp中时它会将它保持为Int。 如果没有温度表,你会怎么做?这似乎是解决这个问题的最简单方法。 – Barnie

+0

@Barnie:我假设你说的是桌子的结构,但是没有在你的问题中显示出来。从临时表中选择*进行检查。 – Limey

+0

是的,我只是做了这件事,而且它完美地工作。我真的希望只是在动态填充它,而不是声明它。感谢您的帮助!我现在还无法赞成,但我会将其标记为正确的答案 – Barnie

如果理解正确的话,那么就尝试

SELECT AVG(DATEDIFF(dd, StartDate, EndDate)) AvgTime 
    FROM #AvgTable 
+0

我修改了脚本,将DateDiff放在主插入到临时表中。 AVG部分是什么踢我的屁股,以便我可以拉动整个[LengthOfTime]列的AVG。 此外,我试图从插入它后,从临时表中拉出任何数据时,出现奇怪的错误。 – Barnie