2015-03-04 6 views
2

У меня есть 3 таблицы Customer, Applications, ApplicationHistory. Я должен получить следующие данные:SQL: Среднее количество заявок на клиента за последние x месяцев

  1. Получить среднее число заявок на одного клиента за последние 3 месяца
  2. Получить количество клиентов с по крайней мере одним или несколькими приложениями за последние 3 месяца

I пытался группу, однако, имеющих следующие вопросы:

  • ApplicationHistory таблица имеет несколько записей для каждого приложения, теперь знаю, как Elimi Нейт их &

  • Примечание: Включили таблицу клиентов, как нужно фильтровать данные по CustomerType

Можете ли вы подсказать, как я могу получить это право?

Большое спасибо,

Мое решение (не работает)

SELECT a.ApplicationId, a.CustomerId, count(*) count       
from [application] a 
inner join [applicationhistory] ah on a.ApplicationId = ah.ApplicationId 
inner join Customer c on c.CustomerId = a.CustomerId 
where ah.EventDate between @StartDateFilter and @EndDateFilter 
     --c.CustomerType in (A, B) 
group by a.ApplicationId, a.CustomerId 

Структура таблицы:

Customer 
Name CustomerId CustomerType 
test1 1    A 
test2 2    B 

Applications 
ApplicationId CustomerId 
3     1 
4     1 
5     2     
6     2     
7     2     

ApplicationHistory 
ApplicationId EventDate   EventType 
3    2014-12-01   New 
3    2014-12-01   Updated 
3    2014-12-02   Withdrawn 
4    2014-12-02   New 
4    2014-12-03   Updated 
5    2014-12-05   New 
5    2014-12-06   Updated 
5    2014-12-06   Updated 
5    2014-12-07   Updated 
6    2014-12-08   New 
+0

ли вам определить «среднее число приложений» как ApplicationHistories с EventType «New» в заданный временной интервал или любой EventType? –

+0

@Bernd: «Среднее количество приложений» будет в среднем число приложений в таблице приложений для клиента. Кроме того, система fyi создает строку в таблице ApplicationHistory для каждого изменения, сделанного клиентом, то есть новое приложение, обновление в приложении и т. Д. И чтобы применить фильтр даты, я должен использовать эту таблицу ApplicationHistory в запросе, так как он имеет более чем одну строку для каждого приложения (для разных типов событий), я не могу обойти это. – Maverick09

+0

Редактируйте свой вопрос с образцами данных. Таблица «Приложения», как вы ее определили, не имеет «количества приложений». Вы можете получить общее количество приложений, но среднее значение на самом деле не имеет смысла. –

ответ

1

Во-первых, запрос не нужны объединения - - если вы не заботитесь о клиентах без каких-либо приложений. Таким образом, это более простой вариант, чтобы получить общий

select ah.CustomerId, count(*) as cnt       
from applicationhistory ah 
where ah.EventDate between @StartDateFilter and @EndDateFilter 
group by a.CustomerId; 

Обратите внимание, что group by имеет только CustomerId и не ApplicationId.

Если вы хотите только "Новое" приложение, использование where:

select ah.CustomerId, count(*) as cnt       
from applicationhistory ah 
where ah.EventDate between @StartDateFilter and @EndDateFilter and 
     EventType = 'New' 
group by a.CustomerId; 

Если вы хотите чистые приложения "новый" - "отозвано", а затем использовать условную агрегацию:

select ah.CustomerId, 
     sum(case when EventType = 'New' then 1 else -1 end) as cnt     
from applicationhistory ah 
where ah.EventDate between @StartDateFilter and @EndDateFilter and 
     EventType in ('New', 'Withdrawn') 
group by a.CustomerId; 
+0

Гордон: Большое спасибо за ваш ответ, и извинился, что совершил ужасную ошибку в моем вопросе. ApplicatioryHistory не имеет столбец CustomerId (обновленный мой вопрос). Поэтому мне нужно будет присоединиться к таблице приложений. Кроме того, мне нужно отфильтровать определенный тип клиента, поэтому мне также необходимо присоединиться к таблице Customer. – Maverick09