【问题标题】:Count distinct with repeating entries over time随着时间的推移重复条目计数不同
【发布时间】:2016-05-12 15:03:13
【问题描述】:

这是我的第一个 stackoverflow 问题,所以请保持温和 ;-)

我有一个包含唯一客户 ID 的表和一个包含特定交易类型(购买、预售等)的交易的表

我要统计的是所有做过一次特定交易类型的客户。但如果客户在 2014 年进行了符合条件的交易,我不希望该客户在 2015 年再次被计算在内。这有意义吗?

我尝试了以下说法:

SELECT

datepart(yyyy,t.TransactionDate)
,count(DISTINCT c.customerID)

FROM Customers as c

   JOIN Transactions as t
   ON c.CustomerID = t.CustomerID

WHERE t.TransactionType = 'presell'
GROUP BY datepart(yyyy,t.TransactionDate)

问题在于,当然,客户可以每年进行一次相同的交易类型。因此,在此声明中,我计算了每年不同的客户......而不是总共一次。

编辑:让我们让它更容易一些。只有一张桌子,这张桌子看起来有点像这样:

所以如果我过滤“预售”,我的结果应该看起来像这样

2014 年客户 A 进行了预售,2015 年客户 B 进行了预售,2016 年客户 A 再次进行了预售,但我没有计算这个客户,因为我在 2014 年已经计算过了。希望能让事情更清楚一点.

在这里感谢您的任何建议和帮助。

【问题讨论】:

  • 当您说:“但是如果客户在 2014 年进行了符合条件的交易”,您的意思是您只想计算相隔 2 年的符合条件的交易吗?请详细说明
  • 欢迎来到 Stackoverflow。在询问 SQL 问题时,如果您包含表结构、示例数据和预期输出,以及您所做的任何尝试以及它们如何不起作用(返回错误数据,给出错误等)。请看:stackoverflow.com/help/how-to-ask
  • 正如 Tom H 所说,如果您冷包括 2 个表的示例,以及您期望从查询中获得的结果类型的示例,这将有很大帮助 :)
  • 好的,谢谢您的建议。我编辑了我原来的问题。也许这有帮助

标签: sql tsql sql-server-2012


【解决方案1】:

当您查看它时,它是您感兴趣的每位客户的第一次预售。您可以通过选择每位客户的MIN(TransactionDate) 轻松获得。完成此操作后,您就可以数数了。

select year, count(*)
from
(
  select customerid, min(transactiondate) as year
  from transactions
  where transactiontype = 'Presell'
  group by customerid
) first_presells
group by year
order by year;

【讨论】:

    【解决方案2】:

    由于您想按TransactionType 计算Customers,因此您应该按CustomerIDTransactionType 分组,而不是TransactionDate

    SELECT  datepart(yyyy,t.TransactionDate) -- this part won't work anymore without grouping it. Doesn't seem to be relevant to what you're selecting
        ,count(DISTINCT c.customerID)
    
    FROM Customers as c
    
       JOIN Transactions as t
       ON c.CustomerID = t.CustomerID
    
    WHERE t.TransactionType = 'presell'
    GROUP BY c.CustomerID, t.TransactionType
    

    这应该返回至少完成一次交易的人数,无论年份。

    【讨论】:

      【解决方案3】:

      用途:

      SELECT  datepart(yyyy,t.TransactionDate) ,
      count(*) over (partition by c.CustomerID, t.TransactionType)
      
      FROM Customers as c
      
         JOIN Transactions as t
         ON c.CustomerID = t.CustomerID
      
      WHERE t.TransactionType = 'presell'
      

      您可以查看http://www.sqlteam.com/article/sql-sever-2005-using-over-with-aggregate-functions,了解有关此类聚合函数的更多信息。

      【讨论】:

        猜你喜欢
        • 2016-10-07
        • 2018-09-10
        • 1970-01-01
        • 2013-06-19
        • 2022-08-24
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        相关资源
        最近更新 更多