1

这是我之前提出的问题的第二部分,并且已经得到了答案。

在那里,我想统计每个月、每年的所有新客户。现在我想通过电子邮件地址实际查看谁是新人的列表(但我并不真正理解回答该问题的代码,所以我仍然对自己做这件事感到迷茫,更重要的是,确认它是正确的)。

理想情况下,结果将只是一列电子邮件地址。例如:

2011 年 6 月的新客户

Month
email1@abc.com
email2@def.net
email3@ghi.edu

如果做起来不太复杂,按月将它们分组也可以。意义...

2011年新客户

Jan      Feb      Mar
email1   email4   email7
email2   email5   email8
email3   email6   email9

...等等。不过,为了我能够尝试理解,我可能更喜欢一次只显示一个月的更简单的方法,哈哈。

标准非常简单:

  • 2011 年 6 月首次下单的所有客户的列表。
  • 从我的第一个问题开始:我知道“新客户”被定义为 (a)从未在 2011 年 6 月 1 日之前订购过的人,以及 (b)在 2011 年 6 月 1 日之后至少有一个订单的人。

我的表称为tblOrders。我的电子邮件称为电子邮件。日期是OrderDate

请注意,更简单的代码对我来说更容易理解,除非在这里无法保持简单。这个查询对我来说似乎很直接......我明白了逻辑,但不知道如何实际去做!:(

如果您需要任何其他信息,请询问!谢谢!

编辑:如果它有帮助,我之前得到了这个人造代码,但它超出了我的范围。/哑的

SELECT <customer info> 
FROM <customer table> 
WHERE (SELECT COUNT(<order info>) 
    FROM <order table> 
    WHERE <customer info> = <current customer> 
        AND <date> < <target date>) = 0 
        AND (SELECT COUNT(<order info> 
            FROM <order table> 
            WHERE <customer info> = <current customer> 
            AND <date> > <target date>) > 0
4

4 回答 4

2

以下查询为您获取每个客户的第一个订单日期:

select email, min(orderdate) as FirstOrderDate
from orders o
group by email;

要按月计算新客户数量:

select year(FirstOrderDate) as yr, month(FirstOrderDate) as mon, count(*)
from (select email, min(orderdate) as FirstOrderDate
      from orders o
      group by email
     ) oc
group by year(FirstOrderDate), month(FirstOrderDate);

要获得给定月份的客户:

select email
from (select email, min(orderdate) as FirstOrderDate
      from orders o
      group by email
     ) oc
where FirstOrderDate >= '2013-01-01' and
      FirstOrderDate < '2013-02-01'

将它们放在并行列表(多列)中可能不值得。

于 2013-06-24T21:29:11.223 回答
1
SELECT MIN(OrderDate) AS MOD FROM dbo.tblOrders;

为您提供表中最小的 OrderDate。

SELECT Email, MIN(OrderDate) AS MOD 
FROM dbo.tblOrders
GROUP BY Email;

每个唯一的电子邮件地址为您提供第一个订单的日期。

SELECT Email, MIN(OrderDate) AS MOD 
FROM dbo.tblOrders
GROUP BY Email
HAVING MIN(OrderDate) >= '20110601' AND MIN(OrderDate) < '20110701';

为您提供所需客户的电子邮件以及他们的第一个 OrderDate。

要满足您的第二个要求,您只需要删除该子句的<一部分:HAVING

SELECT Email, MIN(OrderDate) AS MOD 
FROM dbo.tblOrders
GROUP BY Email
HAVING MIN(OrderDate) >= '20110601';

这为您提供了在 2011-06-01 或之后订购的所有客户,但不是在此之前。

于 2013-06-24T21:29:54.467 回答
0

这是本月工作良好....Sql

SELECT COUNT(ID) as newpermonth FROM dbo.tblOrders GROUP BY ID HAVING MIN(OrderDate) >= DATE_FORMAT(Sysdate(),'%Y-%m-01') AND MIN(OrderDate) < DATE_FORMAT(Sysdate(),' %Y-%m-31')

于 2019-10-11T19:31:06.047 回答
0

在这里.. 对于当前的几个月

 SELECT COUNT(ID) as permnt
    FROM tbl_CustomerDetails 
    where datepart(month,CreatedDate)= datepart(month,GETDATE())
于 2015-10-14T10:31:32.620 回答