2015-04-08 3 views
0

У меня есть пол-рабочей версия этого уже, см SQL Скрипка ниже:графы различных записей в одной таблице для данного диапазона дат

http://sqlfiddle.com/#!6/74ab3/3

Метод я использую работу, по большей части , но мне требуется создать и заполнить отдельную таблицу дат, которую я использую, чтобы присоединиться к моей исходной таблице. Кроме того, способ, которым я сейчас использую его, когда он соответствует записи дата

Я ищу, чтобы быть в состоянии получить отчетливые COUNT из custid для каждого groupid, cust_type, cust_date комбинации, которая уже существует. Счет должен включать диапазон дат сам по себе и 3 месяца (cust_date и dateadd(m, 2, cust_date)). Например, в январе 2014 года он должен включать в отчет COUNT с января 2014 года, февраль 2014 года и март 2014 года.

Я надеюсь найти способ сделать это, что не потребует предварительного заполнения отдельный таблица. Есть идеи?

ответ

0

вы можете попробовать что-то вроде этого SQL Fiddle

;WITH monthrange AS 
(
    SELECT 0 as mnth UNION ALL SELECT 1 UNION ALL SELECT 2 
), recordrange AS 
(
    SELECT groupid,custid,cust_type,DATEADD(month,-mnth,cust_date) cust_date 
    FROM records cross join monthrange 
) 
SELECT DISTINCT d.groupid, d.cust_type, d.cust_date, COUNT(DISTINCT d.custid) as cust_count 
FROM recordrange d 
WHERE d.cust_date >= (SELECT MIN(cust_date) FROM records) 
GROUP BY d.groupid, d.cust_type, d.cust_date 
+0

К сожалению, это не правильно. Это дает слишком много результатов. В таблице «записей» должно быть только 12 строк, по 1 для каждой записи. – user2162331

+0

@ user2162331 - В вашей скрипке, для groupid 'FL444', есть только записи для '01/01/2014',' 03/01/2014' и '07/01/2014'. В вашем выводе для этой группы есть строки для '02/01/2014',' 05/01/2014' и '06/01/2014'. Можете ли вы отредактировать свой вопрос и детализировать ожидаемый результат. – ughai

+0

@ user2162331 - обновил ответ, чтобы соответствовать ожидаемому результату и количеству строк (14), как в вашей скрипке. – ughai

0

как насчет:

with dat as (
    select 1 line 
     , cast('2014-01-01' as date) date_min 
     , cast('2014-03-01' as date) date_max 
    union all 
    select line + 1 
     , dateadd(month,1,date_min) 
     , dateadd(month,1,date_max) 
    from dat where line<12 
) 
select d.groupid, d.cust_type, dt.date_min, dt.date_max 
    , count(distinct custid) as cust_count 
from records d 
join dat dt on d.cust_date between dt.date_min and dt.date_max 
group by d.groupid, d.cust_type, dt.date_min, dt.date_max; 
Смежные вопросы