Sql CountDistinct()在SSR中分组时是两次计数值

Sql CountDistinct()在SSR中分组时是两次计数值,sql,reporting-services,Sql,Reporting Services,在SSRS中构建报告,以上是我的疑问。报告参数包括开始日期、结束日期和单位ID 在报告中,我有3个行组-月、年、SquadName。在报告中,我将TotalReps用于TotalReps,CountDistinct(Field!RegisterId.Value)用于ConfirmedRegisters,Count(Field!RegisterId.Value)用于签入。总计只是表达式SUM(CountDistinct(Field!RegisterId.Value))的总和 报告显示: -- Sa

在SSRS中构建报告,以上是我的疑问。报告参数包括开始日期、结束日期和单位ID

在报告中,我有3个行组-月、年、SquadName。在报告中,我将TotalReps用于TotalReps,CountDistinct(Field!RegisterId.Value)用于ConfirmedRegisters,Count(Field!RegisterId.Value)用于签入。总计只是表达式SUM(CountDistinct(Field!RegisterId.Value))的总和

报告显示:

-- 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
一些定义。确认注册表表示该Id存在于表1和表2中。签入只是表2 ID的计数。因此,要进行签入,表2中必须有一行,并且无论签入的次数和发生时间如何,确认登记员只能计数一次。因此,如果表1登记发生在2016年1月,并且如我们的测试数据所示,2016年1月和2月有登记ID的签入,则报告应在2月的ConfirmedRegisters列中显示零,因为登记ID是在1月计算的

应该是:

           TotalReps    ConfirmedRegisters  CheckIns
WEST

  2016

    Jan

              21            1            2

    Feb

              77            1            1

TOTAL         98            1            3
请注意,已确认的登记总数显示正确,我猜是因为它是整个日期范围的总和。但是对于CONFIRMEDREGISTERS列来说,每月的总数是不正确的,因为它计算的是1月和2月的RegisterID,它应该只计算1月,而不计算2月的任何值或0


不确定是否需要在查询或报告中修复此问题。

我通过使用带有窗口功能的CTE(row_number()over(partition…)来模拟“First()”来修复此问题'键入函数,这样我就可以从表2中计算每个RegisterId的首次出现次数。

您无法在报告中解决此问题。
CountDistinct
将在它所在的每个组中进行不同的计数。请尝试在查询中执行某些操作,就像您怀疑的那样。
           TotalReps    ConfirmedRegisters  CheckIns
WEST

  2016

    Jan

              21            1            2

    Feb

              77            0            1

TOTAL         98            1            3