-- Sample data.
declare @Table1 as Table ( RegisterId Int Identity, UnitId Int, DateRegistered date);
declare @Table2 as Table ( Id Int Identity, RegisterId Int, Rep1 int, Rep2 int, DateCreated Date );
declare @Table3 as Table ( UnitId int Identity, UnitName varchar(40), SquadName varchar(40))
insert into @Table1 ( UnitId, DateRegistered )
values
( 1, '20160115' );
insert into @Table2 ( RegisterId, Rep1, Rep2, DateCreated )
values
( 1, 3, 4, '20160122' ), ( 1, 10, 4, '20160129' ), ( 1, 32, 45, '20160210' );
insert into @Table3 ( UnitName )
values
( 'Tango', 'West' ), ( 'Lima', 'West' ), ( 'Foxtrot', 'West' );
SELECT t3.UnitName
, t2.RegisterId
, t2.DateCreated
, t2.Rep1 + t2.Rep2 as 'TotalReps'
, DateName(month, t2.DateCreated) as 'Month'
, DateName(year, t2.DateCreated) as 'Year'
FROM @Table1 t1
INNER JOIN @Table2 t2 ON t1.RegisterId = t2.RegisterId
INNER JOIN @Table3 t3 ON t1.UnitId = t3.UnitId
在SSRS中构建报告,以上是我的查询。报告参数是开始日期,结束日期和UnitId(s)。
在报告中,我有3个行组 - 月,年,SquadName。在报告中,我使用TotalReps for totalreps,CountDistinct(Field!RegisterId.Value)用于ConfirmedRegisters和Count(Field!RegisterId.Value)用于CheckIn。 TOTALs只是表达式的SUMS,SUM(CountDistinct(Field!RegisterId.Value))。
报告显示如下:
TotalReps ConfirmedRegisters CheckIns
WEST
2016
Jan
21 1 2
Feb
77 1 1
TOTAL 98 1 3
一些定义。 ConfirmedRegister表示Id存在于Table1 AND Table2中。 Checkin只是Table2 Ids的计数。因此,要成为一个签到者,Table2中必须有一行,并且只能记录一次ConfirmedREgister,无论签入次数是多少以及何时发生。因此,如果我们的测试数据显示2016年1月发生了Table1注册并且2016年1月和2月注册了注册,那么报告应该在2月的ConfirmedRegisters列中显示零,因为RegisterId在1月计算。
应该是:
TotalReps ConfirmedRegisters CheckIns
WEST
2016
Jan
21 1 2
Feb
77 0 1
TOTAL 98 1 3
请注意,TOTAL确认寄存器显示正确,我猜是因为它总计了整个日期范围。但是,对于CONFIRMEDREGISTERS列,MONTHLY总计不正确,因为它正在计算Jan和Feb的RegisterID,它应该只计算Jan并且不计算2月的0或0。
不确定我是否需要在查询或报告中修复此问题。
答案 0 :(得分:0)
我通过使用带窗口函数的CTE(row_number()over(partition ...)来修复它,以模仿' First()'类型函数,这样我就可以计算第一次出现的表2中的每个RegisterId。