Tsql 字段上的SSRS分组=多值参数

Tsql 字段上的SSRS分组=多值参数,tsql,reporting-services,Tsql,Reporting Services,我有一份SSRS报告,其中一个参数是多选。我需要一个具有聚合行的行组,该聚合行具有总计行,该总计行仅基于用户从下拉列表中选择的内容对某个数字求和。例如,如果下拉列表包含A=4、B=7、C=1和D=3,那么假设用户只选择A和C。分组仅显示包含A和C的行(不将它们分成组,只返回行),总数应为5 您需要将表达式中的参数绑定到多值参数,该表达式可以使用'in'子句进行计算。现在使用SSRS时,它处理参数的方式与SQL不同,因此我认为您可以少编写一些代码。下面是SQL中的一个直接自提取和运行的示例 dec

我有一份SSRS报告,其中一个参数是多选。我需要一个具有聚合行的行组,该聚合行具有总计行,该总计行仅基于用户从下拉列表中选择的内容对某个数字求和。例如,如果下拉列表包含A=4、B=7、C=1和D=3,那么假设用户只选择A和C。分组仅显示包含A和C的行(不将它们分成组,只返回行),总数应为5

您需要将表达式中的参数绑定到多值参数,该表达式可以使用'in'子句进行计算。现在使用SSRS时,它处理参数的方式与SQL不同,因此我认为您可以少编写一些代码。下面是SQL中的一个直接自提取和运行的示例

declare @People Table ( personID int identity, person varchar(8));

insert into @People values ('Brett'),('Sean'),('Chad'),('Michael'),('Ray'),('Erik'),('Queyn');

declare @Orders table ( OrderID int identity, PersonID int, Description varchar(32), Amount int);

insert into @Orders values (1, 'Shirt', 20),(1, 'Shoes', 50),(2, 'Shirt', 22),(2, 'Shoes', 52),(3, 'Shirt', 20),(3, 'Shoes', 50),(3, 'Hat', 20),(4, 'Shirt', 20),(5, 'Shirt', 20),(5, 'Pants', 30),
(6, 'Shirt', 20),(6, 'RunningShoes', 70),(7, 'Shirt', 22),(7, 'Shoes', 40),(7, 'Coat', 80)


declare @Ords table 
    (
        value varchar(32)
    )

--PLAY with values to see agregation works with different MULTIPLE CHOICES
-- in reality @Ords would be your parameter and the rest of the stuff if just 
-- faking a dataset.
insert into @Ords VALUES ('Shirt');
--insert into @Ords VALUES ('Shirt'),('Shoes');
--insert into @Ords VALUES ('Shirt'),('Shoes'),('Hat');

 -- simple way when you can expose dataset to join to.
Select 
    p.personID
,   p.person
,   sum(case when v.value is not null then 1 end)
,   sum(case when v.value is not null then Amount end)
from @People p
    left join @Orders o on o.PersonID = p.personID
    left join @Ords v on o.Description = v.value    
group by p.personID, p.person
order by p.personID
;

-- With SSRS you probably cannot JOIN directly to your parameter(never tried it though, maybe you can)
-- so you need to do an 'IN' expression in a CTE and then aggregate your CTE.  You can shorten this 
-- in SSRS to be in (@parameterName) instead of (Select value from @ParameterName)
With a as 
    (
    Select 
        p.person
    ,   p.personID
    ,   case when o.Description in (Select value from @Ords) then 1 end as Cnt
    ,   case when o.Description in (Select value from @Ords) then Amount end as Amount
    from @People p
        left join @Orders o on o.PersonID = p.personID
    )
Select
    personID
,   person
,   count(Cnt)
,   sum(Amount)
from a
group by personID, person
order by personID

谢谢djangojazz,这是一个很酷的建议,但我也许应该说得更清楚一些。我在SSRS中寻找一种功能或操作来实现这一点。我有一个SP在报表后面运行,将数据拉入报表。我只是想在报表设计中操纵数据。我尝试过使用=join函数和其他一些东西,但我就是找不到解决方案。我从来没有这样做过,但你可以通过一个参数在SSRS中将其分组为“分组”。然后只要做一个[SUM(DataField)],分组就会自动处理数学部分。一个我会远离的表达式,因为你将不得不做一个计算,而IMHO表达式在聚合时是不好的。必须使用它们,或者直接使用sql、计算列、自定义代码或分组。我有一些情况下,我使用自定义表达式的百分比分组,我很遗憾,因为它们太慢,需要重写,我懒得这么做。如果你有一个过程,你能改变代码吗?我在过程中遇到的问题是,您正在剥夺所有的灵活性,并将其放入代码中。好处是您可以直接从SQL更改结果。这是一个好坏参半的祝福,取决于你的处境。出于这个原因,我通常将视图和表函数与SSR一起使用。速度可能永远不会像proc那样好,但我对表示级别有更多的控制。