如何从计数不同的查询中过滤掉

问题描述 投票:1回答:2

我正在计算过去3个月和6个月内活跃的客户数量。

SELECT COUNT  (DISTINCT CustomerNo) FROM SalesDetail
WHERE InvoiceDate > (GETDATE() - 180) AND InvoiceDate < (GETDATE() - 90)

SELECT COUNT  (DISTINCT CustomerNo) FROM SalesDetail
WHERE InvoiceDate > (GETDATE() - 90)

但是,根据上述查询,即使有重复,我也会得到过去3个月和最近6个月都处于活动状态的客户数。

  • 客户A在过去3个月内购买过一次
  • 客户A在过去6个月内也购买了一次

我如何过滤客户,因此,如果客户A在过去3个月和6个月内都处于活动状态,则只会在“过去3个月内处于活动状态”查询中而不是在“也过去6个月。

sql-server tsql
2个回答
0
投票

我怀疑您要在此处进行条件聚合:

SELECT
    CustomerNo,
    COUNT(CASE WHEN InvoiceDate > GETDATE() - 90 THEN 1 END) AS cnt_last_3,
    COUNT(CASE WHEN InvoiceDate > GETDATE() - 180 AND InvoiceDate < GETDATE() - 90
               THEN 1 END) AS cnt_first_3
FROM yourTable
GROUP BY
    CustomerNo;

这里cnt_last_3是最近3个月的计数,cnt_first_3是从6个月前开始到3个月前结束的3个月期间的计数。


0
投票

如果您想要不重复计数,您可以像这样添加不重复

Select 
 count( Case when dt between getdate()- 90 and getdate()  then id else null end) cnt_3_months
,count(distinct Case when dt between getdate() - 180 and getdate() - 90 then id  else null end) cnt_6_months
from a
© www.soinside.com 2019 - 2024. All rights reserved.