想知道您是否可以帮我复制从excel到SQL Server 2008的公式。我们要做的是计算客户来电时的重复呼叫次数,并测试他们是否在7天内回电。我在excel中完成了下面的练习,但是我发现很难在SQL中生成相同的结果。
重复标记公式基本上计算ID日期之后和7天内的记录数。 2015年3月24日的2222在7天内有4个电话。
Repeat Flag formula =COUNTIFS(B:B,B2,A:A,">" &A2,A:A,"<"&A2+8)
Date ID Repeat Flag
23/03/2015 1111 0
24/03/2015 2222 4
25/03/2015 2222 3
26/03/2015 2222 2
27/03/2015 3333 5
28/03/2015 2222 1
29/03/2015 2222 0
30/03/2015 3333 7
31/03/2015 3333 7
1/04/2015 3333 7
2/04/2015 3333 7
3/04/2015 3333 7
4/04/2015 3333 7
5/04/2015 3333 6
6/04/2015 3333 5
7/04/2015 3333 4
8/04/2015 3333 3
9/04/2015 3333 2
10/04/2015 3333 1
11/04/2015 3333 0
这是我的SQL尝试:
SELECT [CallID]
,[Date]
,[ID]
,[NoRepeat7days]
,[RepeatFlag]
, (SELECT count(CALLID) as CountR
FROM [CustomerData].[dbo].[RepeatCallers_testdata]
WHERE [ID] = [ID] AND
([Date] BETWEEN [Date] AND [Date]+7)) as ft
FROM [CustomerData].[dbo].[RepeatCallers_testdata]
答案 0 :(得分:2)
如果对表进行别名,则查询将起作用,因此SQL Server引擎没有歧义。注意:这是粗略的一瞥。
看起来@Gordon Linoff已经抛弃了一个外部应用答案,所以我不会走这条路。
您可以尝试其他一些选项。一种是使用Window函数。这非常快,因为它只扫描一次表格以获得答案。我没有这个方向的示例代码,也没有时间来完成它。如果你正在处理足够小的集合,这不是问题,所以我不会去这个方向。前往窗口函数(基于集合的操作)的主要原因是当您需要更高的性能或规模时。
CLR还为您提供了使用.NET进行编码的选项。如果您的原始Excel代码是在VB宏中,您将能够迁移代码并进行调整,因此它是VB.NET而不是VB。
答案 1 :(得分:1)
一种方法使用outer apply
,看起来像这样:
select td.*, td2.flag
from [CustomerData].[dbo].[RepeatCallers_testdata] td OUTER APPLY
(select count(*) as flag
from [CustomerData].[dbo].[RepeatCallers_testdata] td2
where td2.id = td.id and
td.[date] between dateadd(day, 1, td2.[date]) and dateadd(day, 7, td2.[date])
) td2;