下面演示了使用CTE生成日期的表格,并生成使用CTE的总结报告。当销售代表没有适用的销售时,他们将被忽略。
尝试跳转报告参数,例如设置@RollingMonths
到1
,以获得更多娱乐。
-- Sample data.
declare @Sales as Table (rep_id Int, month_yr Date, num_sales Int);
insert into @Sales (rep_id, month_yr, num_sales) values
(1, '01/01/2012', 3),
(1, '05/01/2012', 1),
(1, '11/01/2012', 1),
(2, '02/01/2012', 1),
(2, '05/01/2012', 2);
select * from @Sales;
-- Reporting parameters.
declare @ReportEnd as Date = DateAdd(day, 1 - Day(GetDate()), GetDate()); -- The first of the current month.
declare @ReportMonths as Int = 6; -- Number of months to report.
declare @RollingMonths as Int = 12; -- Number of months in rolling sums.
-- Report.
-- A CTE generates a table of month/year combinations covering the desired reporting time period.
with ReportingIntervals as (
select DateAdd(month, 1 - @ReportMonths, @ReportEnd) as ReportingInterval,
DateAdd(month, 1 - @RollingMonths, DateAdd(month, 1 - @ReportMonths, @ReportEnd)) as FirstRollingMonth
union all
select DateAdd(month, 1, ReportingInterval), DateAdd(month, 1, FirstRollingMonth)
from ReportingIntervals
where ReportingInterval < @ReportEnd)
-- Join the CTE with the sample data and summarize.
select RI.ReportingInterval, S.rep_id, Sum(S.num_sales) as R12_Sum
from ReportingIntervals as RI left outer join
@Sales as S on RI.FirstRollingMonth <= S.month_yr and S.month_yr <= RI.ReportingInterval
group by RI.ReportingInterval, S.rep_id
order by RI.ReportingInterval, S.rep_id
使用CTE或数字表来生成所需日期的范围,然后左外部连接您的数据。 – HABO 2013-03-21 15:10:03
嘿HABO,我会如何实现这个?我创建了一个指定从1/01/11向前的所有日期的CTE。左外连接是否真的会从CTE返回所有行? – Jeremy 2013-03-21 15:25:04
您希望创建一个CTE,以返回报告范围内每月的第一个月份,例如,过去的12个月。然后加入你的滚动12个月总结表。需要外部联接以确保输出中仍包含没有活动的报告月份。 – HABO 2013-03-21 16:52:57