Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 随着时间的推移,使用重复条目进行计数_Sql_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 随着时间的推移,使用重复条目进行计数

Sql 随着时间的推移,使用重复条目进行计数,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,这是我的第一个问题,请温柔一点;-) 我有一个带有唯一customerID的表,还有一个表,其中包含他们在特定交易类型(购买、预售等)下的交易 我要统计的是所有曾经做过特定交易类型的客户。但如果客户在2014年进行了符合条件的交易,我不希望该客户在2015年再次被计算在内。这有意义吗 我尝试了以下陈述: SELECT datepart(yyyy,t.TransactionDate) ,count(DISTINCT c.customerID) FROM Customers as c J

这是我的第一个问题,请温柔一点;-)

我有一个带有唯一customerID的表,还有一个表,其中包含他们在特定交易类型(购买、预售等)下的交易

我要统计的是所有曾经做过特定交易类型的客户。但如果客户在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)
当然,问题是客户每年可以做一次相同的交易类型。因此,通过这份声明,我每年都会统计不同的客户数量……而不仅仅是总共一次

编辑:让它变得简单一点。只有一个表,该表看起来有点像这样:

所以如果我过滤“Presell”,我的结果应该有点像这样

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


感谢您在此提供的建议和帮助。

既然您想按
交易类型
统计
客户
,您应该按
客户ID
交易类型
分组,而不是按
交易日期

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
这应返回至少完成一次类型事务的人数,无论年份如何。

使用:

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'

您可以查看此聚合函数的更多信息。

当您查看它时,它是您感兴趣的每个客户的第一个预售。您可以通过选择每个客户的
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;

当你说:“但如果客户在2014年进行了合格交易”,你的意思是你只想计算相隔2年的合格交易吗?请详细说明一下,请让我到Stackoverflow。当问一个SQL问题时,如果您包括表结构、样本数据和预期输出(给定该样本数据以及您所做的任何尝试以及它们如何工作)(返回错误数据、给出错误等),则最有可能得到良好的回答。请看:正如Tom H所说,如果您包括这两个表的示例,以及您期望查询结果类型的示例,这将非常有帮助:)好的,谢谢您的建议。我编辑了我的原始问题。也许这会有帮助