在给定日期范围内计算同一表中的不同记录

时间:2015-04-08 05:48:55

标签: sql-server tsql sql-server-2008-r2 group-by

我已经有了这个半工作版本,请参阅下面的SQL Fiddle:

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

我使用的方法大多数情况下,但需要我构建和填充一个单独的日期表,我用它来连接回原始表。此外,一旦匹配记录日期,我目前正在使用它的方式

我正在寻找的是能够为已存在的每个COUNT组合获得custid groupid, cust_type, cust_date个不同的cust_date。计数应包括自身的日期范围和3个月(dateadd(m, 2, cust_date)COUNT)。例如,2014年1月,它应包含2014年1月,2014年2月和2014年3月的独特{{1}}记录。

我希望找到一种不需要预先填充单独表格的方法。有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;