【问题标题】:Get new customers every week in SQL Server每周在 SQL Server 中获得新客户
【发布时间】:2014-11-14 18:47:14
【问题描述】:

我有一些与客户以及他们每天执行的交易数量相关的数据。我想看看我们每周有多少“新”客户。数据如下所示:

Custnum    Created    Revenue
1    2014/10/23    30
4    2014/10/23    20
5    2014/10/23    40
2    2014/10/30    13
3    2014/10/30    45
1    2014/10/30    56

在上面的(示例)数据中,我们可以看到custnum 1 的客户连续几周有交易,我只想要下一周的新客户,那些过去从未与我们做生意的客户。换句话说,我想要每周的全新客户数量。所以结果应该是:

CustCount    Created
3    2014/10/23
2    2014/10/30

我尝试使用以下查询:

select 
    count(distinct custnum), 
    DATEADD(wk, DATEDIFF(wk, 0, created), 0) as Date
from ORDERS
where created > '2013-01-01'
group by 
    DATEADD(wk, DATEDIFF(wk, 0, created), 0)
order by
    DATEADD(wk, DATEDIFF(wk, 0, created), 0)

但是这个查询给了我每周唯一客户的数量,我想要每周的新客户数量。

任何帮助将不胜感激。

【问题讨论】:

  • 请不要使用不适用于您的问题的标签
  • 这里的一个问题是您不能仅仅依赖前一周,因为他们可能已经是客户但在 2 周内没有购买。

标签: sql sql-server


【解决方案1】:

我对你的问题的理解

我接受了这些陈述:

  • 我想看看每周有多少“新”客户。
  • 过去从未与我们开展业务的[客户]
  • 我想要每周的全新客户数量

你想要

 CustCount    Created
 2            week1    -- customer 1 and 2
 1            week2    -- customer 3
 2            week3    -- customer 4 and 5
 -- Option A
 1            week4    -- customer 6 is new and 2 was not counted 
 -- or Option B
 2            week4    -- customer 6 and 2; 
                       -- since customer 2 did not order anything in week3

选项 A

此查询SELECT Custnum, DATEPART ( week , created) as WeekNumber from Revenues Order by Custnum 为提供的样本数据返回此输出

Custnum    WeekNumber 
1          31       -- counts
1          44       -- does not count, since customer already ordered once
2          36       -- counts
3          36       -- counts
3          44       -- does not count
4          43       -- counts
5          43       -- counts
5          45       -- does not count

第一步:过滤记录

要仅获取客户(新客户)的第一条记录,您可以这样做:

SELECT Distinct Custnum, Min(Created) as Min_Created 
FROM Revenues 
GROUP BY Custnum

第二步:按周计数和分组

首先我使用了来自grouping customer orders by week 的sql,您可以在old sqlfiddle 找到它。但后来我决定使用

Select Count(Custnum) as CountCust 
    , DATEPART(week, Min_Created) as Week_Min_Created 
FROM (
        SELECT Distinct Custnum, Min(Created) as Min_Created  
        FROM Revenues Group By Custnum
    ) sq Group by DATEPART(week, Min_Created)

在我的 上返回

CountCust  Week_Min_Created
1          31    -- only customer 1
2          36    -- customer 2 and 3
2          43    -- customer 4 and 5
-- nothing for week 45 since customer 5 was already counted

一些示例数据

这是我使用的示例数据

CREATE TABLE Revenues 
(
   Custnum int , 
   Created datetime,
   Revenue int 
);

INSERT INTO Revenues (Custnum, Created, Revenue)
VALUES
  (1, '20140801', 30),
  (2, '20140905', 13), (3, '20140905', 45),
  (4, '20141023', 20), (5, '20141023', 40),
  (3, '20141030', 45), (1, '20141030', 56),
  (5, '20141106', 60);

【讨论】:

  • 我要Option A,老客户根本不应该算。 SQLFiddle 解决方案看起来正在实现Option B
  • 我复制了您的 SQL SELECT COUNT(Custnum) , dateadd(week, datediff(day,'20140105',Min_Created) / 7, '20140105') AS WeekStart FROM ( SELECT Distinct Custnum , Min(Created) as Min_Created FROM Revenues Group By Custnum ) o GROUP BY dateadd(week, datediff(day,'20140105',Min_Created) / 7, '20140105'); ,它对我来说确实正确。感谢您的帮助,我真的很感激。
【解决方案2】:

听起来您想使用只有每个客户的第一个订单日期的 ORDERS 子集。

select 
    count(custnum), 
    DATEADD(wk, DATEDIFF(wk, 0, created), 0) as Date
from
    (Select custnum, min(created) as created From Orders Group by custnum) o
where created > '2013-01-01'
group by 
    DATEADD(wk, DATEDIFF(wk, 0, created), 0)
order by
    DATEADD(wk, DATEDIFF(wk, 0, created), 0)

【讨论】:

  • 他将如何识别哪个客户是新客户?
  • @Bill - 这个查询确实给了我一些结果,但我不完全确定它们是否正确。我真的不明白这是如何计算新客户数量的。
  • @lookslikeanevo 这行Select custnum, min(created) as created 仅选择客户的第一条记录。
  • @threeFourOneSixOneThree 在子查询中而不是在主查询中,整体查询的输出是 custnum 和日期的计数。该运营商正在寻找新客户
  • @threeFourOneSixOneThree - 子查询 Select custnum, min(created) as created From Orders Group by custnum 导致第 1 列中的每个客户编号和第 2 列中的第一个交易日期。这意味着应该执行外部查询的数据集已经最小化到只有不同客户的数量。那么当数据集本身被最小化时,整体查询如何导致每周的新客户数量?这有意义吗?该查询实际上返回了一些结果,我只是不确定它们是否正确。我确定我在这里遗漏了一些东西。
【解决方案3】:

您可以添加一个 where 子句,这样 custnum 在一周之前不存在,类似于

custnum not in (select custnum from orders where created < (start date of week))

伪代码,因为我对sql server函数不是很熟悉

【讨论】:

    【解决方案4】:

    更好的设计是将客户注册的日期与其他信息一起存储。 完成后,您可以使用下面链接中的解决方案。

    http://sqlfiddle.com/#!12/2caaa/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多