2016-07-08 3 views
1

Хотите узнать, можете ли вы помочь мне скопировать формулу с Excel на SQL Server 2008. То, что мы пытаемся сделать, - подсчитать количество повторных вызовов с того момента, когда клиент звонит и тестирует если они вернутся через 7 дней. Я выполнил упражнение ниже в excel, однако мне сложно создавать те же результаты в SQL.Подсчитайте количество повторных звонящих в течение 7-дневной минутки

Формула Repeat Flag в основном рассчитывает количество записей после даты ID и в течение 7 дней. I.e 2222 от 24/03/2015 имеет 4 звонка в течение 7 дней.

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] 
+1

Вы почти правы. Вам нужно назначить псевдоним для основного запроса, чтобы убедиться, что SQL Server понимает, что вы имели в виду под вашим [ID] = [ID] ' – cha

ответ

2

Ваш запрос будет работать, если вы псевдоним таблиц, так что нет двусмысленность для механизма SQL Server. ПРИМЕЧАНИЕ. Это был беглый взгляд.

Похоже, что @Gordon Linoff уже выдал внешний ответ, поэтому я не спускаюсь по этому маршруту.

У вас есть другие варианты, которые вы можете попробовать. Один из них - использовать функции Window. Это невероятно быстро, поскольку он только один раз сканирует таблицу, чтобы получить ответ. У меня нет образца кода для этого направления и у меня нет времени для его работы. Если вы имеете дело с достаточно маленькими наборами, это не проблема, поэтому я бы не пошел в этом направлении. Большая причина для перехода к функциям окна (операции на основе набора) - это когда у вас есть потребность в большей производительности или масштабировании.

В CLR также предоставляется возможность кода с использованием .NET. Если ваш исходный код Excel находится в макросах VB, вы сможете перенести код и настроить его так, чтобы он был VB.NET, а не VB.

+0

Спасибо @cha и gregory Я настроил код, и он работает сейчас. ВЫБОР Т. [CallID] \t, Т. [Дата] , Т. [ID] , Т. [NoRepeat7days] , Т. [RepeatFlag] , (SELECT COUNT (CALLID) в качестве Countr из [CustomerData] . [dbo]. [RepeatCallers_testdata] как F ГДЕ T. [ID] = F. [ID] И ([Дата] BETWEEN T. [Дата] +1 и T. [Дата] +7)) как ft FROM [CustomerData]. [Dbo]. [RepeatCallers_testdata] как T – Jimmyn

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;